目录
1 模板的概念
2 函数模板
2.1 函数模板语法
2.2 普通函数与函数模板的区别
2.3 模板的局限性
3 类模板
3.1 类模板语法
3.2 类模板与函数模板的区别
3.3 类模板中成员函数创建时机
3.4 类模板对象做函数参数
3.5 类模板与继承
3.6 类模板份文件编写
3.7 类模板与友元
模板就是建立通用的模具,大大提高复用性!
例如生活中,常说找个ppt模板,是同样的意思!
模板的特点:
作用:建立一个通用函数,其函数返回值类型和形参类型可不具体制定,用一个虚拟类型来代表。
语法: template
解释:
总结:
举例:
//利用模板提供通用的交换函数
template
void mySwap(T& a, T& b)
{T temp = a;a = b;b = temp;
}void test01()
{int a = 10;int b = 20; //利用模板实现交换//1、自动类型推导mySwap(a, b);//2、显示指定类型mySwap(a, b);cout << "a = " << a << endl;cout << "b = " << b << endl;}int main() {test01();system("pause");return 0;
}
注意事项:
调用规则:
实际上,既然提供了函数模板,最好就不要提供普通函数,否则容易出现二义性!
模板的通用性并不是万能的!出现了模板的重载,可以为为这些特定的类型进行具体化的模板。
#include
using namespace std;#include class Person
{
public:Person(string name, int age){this->m_Name = name;this->m_Age = age;}string m_Name;int m_Age;
};//普通函数模板
template
bool myCompare(T& a, T& b)
{if (a == b){return true;}else{return false;}
}//具体化,显示具体化的原型和定意思以template<>开头,并通过名称来指出类型
//具体化优先于常规模板
template<> bool myCompare(Person &p1, Person &p2)
{if ( p1.m_Name == p2.m_Name && p1.m_Age == p2.m_Age){return true;}else{return false;}
}void test01()
{int a = 10;int b = 20;//内置数据类型可以直接使用通用的函数模板bool ret = myCompare(a, b);if (ret){cout << "a == b " << endl;}else{cout << "a != b " << endl;}
}void test02()
{Person p1("Tom", 10);Person p2("Tom", 10);//自定义数据类型,不会调用普通的函数模板//可以创建具体化的Person数据类型的模板,用于特殊处理这个类型bool ret = myCompare(p1, p2);if (ret){cout << "p1 == p2 " << endl;}else{cout << "p1 != p2 " << endl;}
}int main() {test01();test02();system("pause");return 0;
}
作用:建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。
语法:template
解释:
类模板与函数模板区别主要有两点:
类模板中成员函数和普通类中成员函数创建时机是有区别的:
学习类模板实例化出的对象,向函数传参的方式
一共有三种传入方式:
当类模板碰到继承时,需要注意一下几点:
问题:类模板中成员函数创建时机是在调用阶段,导致分文件编写时链接不到
解决:
主流的解决方式是第二种,将类模板成员函数写到一起,并将后缀名改为.hpp