类模板的作用:
建立一个通用模板,类中的成员、数据类型可以不具体制定,用一个虚拟的类型来代表;
模板类的语法:
类模板:
template<class name,class age>//语法
class person{
public:
person(name m_name,age m_age){
this->name = "xiaoming";
this->age = 12;
}
name m_name;
age m_age;
};
类模板和函数模板的区别:
1、类模板没有自动类型推导的使用方式
2、类模板在模板参数列表中可以有默认参数
(自动推导换成默认参数了)
template<class name = string,class age = int>//默认参数
类模板成员函数的调用时机:
类模板中的成员函数只在调用的时候创造;
(也就是说这个成员函数必须在被实例之后,内部的对象的数据类型被确定)
类模板成员函数的类外实现
template<T1 name.T2 age>
person<T1,T2>::person(T1 name,T2 age);
类模板对象做函数参数:
1、指定传入类型
2、参数模板化
3、整个类模板化
template<class T1,class T2>
class person{
public:
person(T1 name,T2 age){
this->m_name = "xiaoming";
this->age = 22;
}
T1 m_name;
T2 m_age;
};
1、指定传入类型
void fun1(person<string,int> &p){}
2、参数模板化
template<class T1,class T2>
void fun2(person<T1,T2> &p){}
3、整个类的模板化
template<class T>
void fun3(T &p);
类模板的继承:
1、当子类继承的父类是一个类模板时,子类在声明时,要指出父类中T的类型
2、如果想灵活指定出父类中T的类型,子类也应变为类模板
类模板和友元 :
全局函数类内实现--直接在类内声明友元即可
**全局函数类外实现--需要提前让编译器知道其存在
//通过全局函数打印person信息
template<class T1,class T2>
class person{
//全局函数类内实现
friend void printPerson(person<T1,T2> p){
cout<<p.m_name<<" "<<p.m_age;
}
friend void printPerson2<>(person<T1,T2> p);//声明类外全局模板函数,一定要加<>
public:
person(T1 name,T2 age){
this->m_name = name;
this->m_age = age;
}
string m_name;
int m_age;
};
//全局函数在类外实现
template<class T1,class T2>
void printPerson2(person<T1,T2> p){
cout<<p.m_name<<" "<<p.m_age;
}