知识点1 类模板成员函数在类外实现
- #include <iostream>
- #include <cstring>
- using namespace std;
- //类模板
- //严格来说类模板的类型不是person而是person<T1,T2>
- template<class T1, class T2>
- class Person
- {
- public:
- T1 name;
- T2 age;
- public:
- //类内声明
- Person(T1 name, T2 age);
- void showPerson(void);
- };
- //类外定义
- template<class T1, class T2>
- Person<T1,T2>::Person(T1 name, T2 age)
- {
- cout << “有参构造” << endl;
- this->name = name;
- this->age = age;
- }
- template<class T1, class T2>
- void Person<T1,T2>::showPerson()
- {
- cout << “name = ” << name << “, age = ” << age << endl;
- }
- int main()
- {
- Person<string,int> ob1(“阿尔贝尔”,114514);
- ob1.showPerson();
- Person<int,int> ob2(89,64);
- ob2.showPerson();
- return 0;
- }
知识点2 类模板的源文件和头文件分离问题
类模板会经过两次编译,第一次是类模板本身的编译,第二次是类模板成员调用的时候进行编译
如果类模板的.cpp和.h分文件编译会产生错误,原因在于第二次编译
因此建议将.cpp和.h文件放在一起构成.hpp文件
知识点3 类模板的应用
知识点4 类模板与友元
#include <iostream>
#include <cstring>
using namespace std;
//提前声明person类
template<class T1, class T2> class Person;
//提前声明函数模板 告诉编译器存在函数模板
template<class T1, class T2> void printPerson02(Person<T1,T2> &ob);
template<class T1, class T2>
class Person
{
private:
T1 name;
T2 age;
public:
Person(T1 name, T2 age);
//友元函数在类中定义(友元不属于该类的成员函数)
friend void printPerson01(Person<T1,T2> &ob)
{
cout << "name = " << ob.name << " age = " << ob.age << endl;
}
//友元函数在类外定义 必须告诉编译器该友元函数是模板函数
friend void printPerson02<>(Person<T1,T2> &ob);
};
template<class T1, class T2>
Person<T1,T2>::Person(T1 name, T2 age)
{
this->name = name;
this->age = age;
}
template<class T1, class T2>
void printPerson02(Person<T1,T2> &ob)
{
cout << "name = " << ob.name << " age = " << ob.age << endl;
}
int main()
{
Person<string,int> ob("阿尔贝尔",114514);
//通过友元访问类模板中的数据
printPerson01(ob);
printPerson02(ob);
return 0;
}