函数模板产生更好的匹配时
当普通函数要发生类型转换,但模板可以直接调用的时候,就会调用函数模板
#include<iostream> using namespace std; template<typename T> void print(T a, T b) { cout << "调用函数模板" << endl; } void print(int a, int b) { cout << "调用普通函数" << endl; } void test1() { char a = 0; char b = 0; print(a, b); } int main() { test1(); return 0; }
这个时候如果时调用普通函数,就会发生隐式类型调用,这个时候用函数模板就不需要,就调用函数模板。
模板的局限性
模板的通用性不是万能的,比如要进行交换操作的时候,如果传参的是数组或者对象的时候,可以调用吗?
#include<string> #include<iostream> using namespace std; template<typename T> void Swap(T &a, T &b) { T tmp = a; a = b; b = tmp; } class A { public: A(string a, int b) { _name = a; _age = b; } string _name; int _age; }; void test1() { A c1("zhangsan", 19); A c2("lisi",20); Swap(c1, c2); cout << c1._name << "的年龄" << c1._age << endl; cout << c2._name << "的年龄" << c2._age << endl; } int main() { test1(); return 0; }
发现并不能实现交换,那对于这些特殊的类型,怎么才可以进行呢?操作符重载吗?试一试:
#include<string> #include<iostream> using namespace std; class A { public: A(string a, int b) { _name = a; _age = b; } void operator=(A& a) { _name =a._name; _age = a._age; } string _name; int _age; }; template<typename T> void Swap(T &a, T &b) { T tmp = a; a = b; b = tmp; } void test1() { A c1("zhangsan", 19); A c2("lisi", 20); Swap(c1, c2); cout << c1._name << "的年龄" << c1._age << endl; cout << c2._name << "的年龄" << c2._age << endl; } int main() { test1(); return 0; }
操作符重载是可以的,那还有没有方法呢?这个时候可以具体化一个类的版本实现,这个时候具体化是优先调用的,那具体化的语法是什么呢?语法:
template< > 返回类型 函数模板名 (参数的数据类型为类名)
#include<string> #include<iostream> using namespace std; template<typename T> void Swap(T& a, T& b) { T tmp = a; a = b; b = tmp; } class A { public: A(string a, int b) { _name = a; _age = b; } string _name; int _age; }; template< > void Swap(A& c1, A& c2) { string tmp1 = c1._name; c1._name = c2._name; c2._name = tmp1; int tmp2 = c1._age; c1._age = c2._age; c2._age = tmp2; } void test1() { A c1("zhangsan", 19); A c2("lisi", 20); Swap(c1, c2); cout << c1._name << "的年龄" << c1._age << endl; cout << c2._name << "的年龄" << c2._age << endl; } int main() { test1(); return 0; }
也是可以实现。
类模板
作用
建立一个通用类,类内成员的数据类型不可具体定义,用一个通用的类型来代表
语法
那类模板的语法是什么?语法如下:
template< typename T>
类
因为类内会有多个数据类型,可以定义多个通用的数据类型,那尝试写一个类模板出来:
#include<iostream> using namespace std; template<typename T1, typename T2> class A { public: T1 _a; T2 _b; }; int main() { return 0; }
是可以正常跑起来的,那怎么使用这个类模板实例化一个对象出来呢?
类模板实例化对象
实例化对象的语法:
类名< 数据类型(为模板参数列表) > 对象名
那选择通过一个类模板实例化出一个对象:
#include<iostream> using namespace std; template<typename T1, typename T2> class A { public: T1 _a; T2 _b; }; void test1() { A<int, char> a1; a1._a = 10; a1._b = 'a'; cout << a1._a << endl; cout << a1._b << endl; } int main() { test1(); return 0; }
类模板与函数模板的区别
1.类模板没有自动类型推导的使用方式
2.类模板在模板参数列表中可以具有默认参数
自动类型推导验证
#include<iostream> using namespace std; template<typename T1, typename T2> class A { public: T1 _a; T2 _b; }; void test1() { A< > a1; a1._a = 10; a1._b = 'a'; cout << a1._a << endl; cout << a1._b << endl; } int main() { test1(); return 0; }
报错了,跑不起来,是不可以用的。
类模板参数列表中可以具有默认参数
这个是什么意思呢?这里用代码证明:
#include<iostream> using namespace std; template<typename T1=int, typename T2=char> class A { public: T1 _a; T2 _b; }; void test1() { A< > a1; a1._a = 10; a1._b = 'a'; cout << a1._a << endl; cout << a1._b << endl; } int main() { test1(); return 0; }
这个代码和上面的代码的区别在哪?
看到,在模板的参数列表中,给通用数据类型进行了赋值,让它具有了默认数据类型,这个时候就可以在实例化对象的时候,不用写数据类型,用默认的数据类型,也可以在改数据类型:
#include<string> #include<iostream> using namespace std; template<typename T1=int, typename T2=char> class A { public: T1 _a; T2 _b; }; void test1() { A<double,string > a1; a1._a = 10.0; a1._b = "abcd"; cout << a1._a << endl; cout << a1._b << endl; } int main() { test1(); return 0; }
类模板中成员函数的创建时机
普通类的成员函数会在一开始就创建,类模板中的成员函数在应用时才会创建,对于类模板中调用其他类的时候的成员函数,在确认数据类型前,可以进行编译,没有问题,但是否调用成功时在确定数据类型后