类模板是通用类的描述,用任意类型(泛型)来描述类的定义。
使用类模板的时候,指定具体的数据类型,让编译器生成该类型的类定义:
语法:
template <class T>
class 类模板名
{
类的定义;
};
回忆一下:使用函数模板的时候,可以让编译器根据实参自动推导出形参的数据类型,也可以手工显式指定数据类型,但是类模板不一样,不存在自动推导数据类型的说法,只能显式指定。——————用类模板创建的时候指定。
就是在类模板名后面放个<>在尖括号中填数据类型。
比如AA<int,double> a;
意思是告诉编译器用int double 代替类模板中的T1 T2,创建一个对象a。
#include<iostream>
using namespace std;
template <class T1,class T2>
class AA
{
public:
T1 m_a;
T2 m_b;
AA(){}
AA(T1 a,T2 b):m_a(a),m_b(b){}
T1 geta() {
T1 a = 2;
return m_a + a;
}
T2 getb() {
T2 b = 2;
return m_b + b;
}
};
int main()
{
AA<int,double> a;
a.m_a = 20;
a.m_b = 30;
cout << "a.geta()=" << a.geta() << endl;
cout << "a.getb()=" << a.getb() << endl;
return 0;
}
a.geta()=22
a.getb()=32
C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 20760)已退出,代码为 0。
按任意键关闭此窗口. . .
细节:
1.使用类模板时,数据库类型必须适应类模板中的代码。
T1 geta() {
T1 a = 2;
return m_a + a;
}
你这块就不能传进去string的东西,int string转换不过来。
2.类模板可以为通用数据类型指定缺省的数据类型。
现在模板类AA有两个通用的数据类型,用AA创建对象的时候在<>中要指明具体用哪两0种具体的数据类型,如果少了一种,编译会报错。
template <class T1,class T2>
AA<int> a;
不过在创建类模板的时候可以为通用参数指定缺省的数据类型:
template <class T1,class T2=string>
AA<int> a;
意思是用模板类创建对象的时候,如果没有指定第二个参数,那就用string;
————————————————————————————————————
模板类的成员函数可以在类外实现:
#include<iostream>
using namespace std;
template <class T1,class T2>
class AA
{
public:
T1 m_a;
T2 m_b;
AA(){}
AA(T1 a,T2 b):m_a(a),m_b(b){}
T1 geta() {
T1 a = 2;
return m_a + a;
}
T2 getb();
};
template <class T1, class T2>
T2 AA<T1,T2>::getb() {
T2 b = 2;
return m_b + b;
}
int main()
{
AA<int> a;
a.m_a = 20;
a.m_b = 30;
cout << "a.geta()=" << a.geta() << endl;
cout << "a.getb()=" << a.getb() << endl;
return 0;
}
template <class T1, class T2>
T2 AA<T1,T2>::getb() {
T2 b = 2;
return m_b + b;
}
———————————————————————————————————————————
可以用new创建创建模板类对象;
AA<int,string>* a=new AA <int,string>(3,"zhongjiaming");
cout << "a->geta()=" << a->geta() << endl;
cout << "a->getb()=" << a->getb() << endl;
delete a;
普通类的类名是标识符
class CGirl
{
};
CGirl是类名,也是一种具体的数据类型;
模板类不是类名,就只是类模板名,不是一种具体的数据类型。
AA<int,string>这个整体才算是类名,才算是一种具体的数据类型;
————————————————————————————————————————
模板类中的任何成员函数只要程序没有调用,就不会创建;