目录
模板就是建立通用的模具,大大提高复用性!
例如生活中,常说找个ppt模板,是同样的意思!
模板的特点:
作用:建立一个通用函数,其函数返回值类型和形参类型可不具体制定,用一个虚拟类型来代表。
语法: template
解释:
总结:
举例:
- //利用模板提供通用的交换函数
- template<typename T>
- 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<int>(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<class T>
- 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