C++笔记6.01

知识点1 类模板成员函数在类外实现

  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4.   
  5. //类模板  
  6. //严格来说类模板的类型不是person而是person<T1,T2>  
  7. template<class T1, class T2>  
  8. class Person  
  9. {  
  10. public:  
  11.     T1 name;  
  12.     T2 age;  
  13. public:  
  14.     //类内声明  
  15.     Person(T1 name, T2 age);  
  16.     void showPerson(void);  
  17. };  
  18. //类外定义  
  19. template<class T1, class T2>  
  20. Person<T1,T2>::Person(T1 name, T2 age)  
  21. {  
  22.     cout << “有参构造” << endl;  
  23.     this->name = name;  
  24.     this->age = age;  
  25. }  
  26.   
  27. template<class T1, class T2>  
  28. void Person<T1,T2>::showPerson()  
  29. {  
  30.     cout << “name = ” << name << “, age = ” << age << endl;  
  31. }  
  32.   
  33. int main()  
  34. {  
  35.     Person<string,int> ob1(“阿尔贝尔”,114514);  
  36.     ob1.showPerson();  
  37.     Person<int,int> ob2(89,64);  
  38.     ob2.showPerson();  
  39.     return 0;  
  40. }  

知识点2 类模板的源文件和头文件分离问题

类模板会经过两次编译,第一次是类模板本身的编译,第二次是类模板成员调用的时候进行编译

如果类模板的.cpp和.h分文件编译会产生错误,原因在于第二次编译

因此建议将.cpp和.h文件放在一起构成.hpp文件

知识点3 类模板的应用

源代码

知识点4 类模板与友元

  1. #include <iostream>  
  2. #include <cstring>  
  3. using namespace std;  
  4.   
  5. //提前声明person类  
  6. template<class T1, class T2> class Person;  
  7. //提前声明函数模板 告诉编译器存在函数模板  
  8. template<class T1, class T2> void printPerson02(Person<T1,T2> &ob);  
  9.   
  10. template<class T1, class T2>  
  11. class Person  
  12. {  
  13. private:  
  14.     T1 name;  
  15.     T2 age;  
  16. public:  
  17.     Person(T1 name, T2 age);  
  18.     //友元函数在类中定义(友元不属于该类的成员函数)  
  19.     friend void printPerson01(Person<T1,T2> &ob)  
  20.     {  
  21.         cout << "name = " << ob.name << " age = " << ob.age << endl;  
  22.     }  
  23.     //友元函数在类外定义 必须告诉编译器该友元函数是模板函数  
  24.     friend void printPerson02<>(Person<T1,T2> &ob);  
  25. };  
  26.   
  27. template<class T1, class T2>  
  28. Person<T1,T2>::Person(T1 name, T2 age)  
  29. {  
  30.     this->name = name;  
  31.     this->age = age;  
  32. }  
  33.   
  34. template<class T1, class T2>  
  35. void printPerson02(Person<T1,T2> &ob)  
  36. {  
  37.      cout << "name = " << ob.name << " age = " << ob.age << endl;  
  38. }  
  39.   
  40. int main()  
  41. {  
  42.     Person<string,int> ob("阿尔贝尔",114514);  
  43.     //通过友元访问类模板中的数据  
  44.     printPerson01(ob);  
  45.   
  46.     printPerson02(ob);  
  47.     return 0;  
  48. }  

发表评论

邮箱地址不会被公开。 必填项已用*标注