C++类模板

类模板语法:

  建立一个通用类,类中的成员 数据类型可以不具体制订,用一个拟的类型来代表     

template<typename T>

解释:

  template  --- 声明创建模板

  typename --- 表明后面的符号是一种数据类型  可以用 class 代替

  T --- 通用的数据类型  名称可以替换 通常为大写字母

复制代码
 1 template<class NameType,class AgeType>
 2 class Person
 3 {
 4 public:
 5     Person(NameType name, AgeType age)
 6     {
 7         this->m_Name = name;
 8         this->m_Age = age;
 9     }
10     void showPerosn()
11     {
12         cout << "name: " << this->m_Name << endl;
13         cout << "age: " << this->m_Age << endl;
14     }
15 public:
16     NameType m_Name;
17     AgeType m_Age;
18 };
19 void test()
20 {
21     Person<string, int>p1("Tom", 11);//赋类型
22     p1.showPerosn();
23 }
复制代码

类模板与函数模板的区别:

1.类模板没有自动类型推导的使用方式

复制代码
 1 template<class NameType,class AgeType>
 2 class Person
 3 {
 4 public:
 5     Person(NameType name, AgeType age)
 6     {
 7         this->m_Name = name;
 8         this->m_Age = age;
 9     }
10     void showPerson()
11     {
12         cout << "name: " << this->m_Name << endl;
13         cout << "age: " << this->m_Age << endl;
14     }
15     NameType m_Name;
16     AgeType m_Age;
17 };
18 //1.类模板没有自动类型推导使用方式
19 void test()
20 {
21     //Person p("Tom", 100);//错误  无法自动类型推导
22     Person<string, int>p("Tom", 100);
23     p.showPerson();
24 }
复制代码

2.类模板在模板参数列表中可以有默认参数

复制代码
 1 template<class NameType,class AgeType = int>
 2 class Person
 3 {
 4 public:
 5     Person(NameType name, AgeType age)
 6     {
 7         this->m_Name = name;
 8         this->m_Age = age;
 9     }
10     void showPerson()
11     {
12         cout << "name: " << this->m_Name << endl;
13         cout << "age: " << this->m_Age << endl;
14     }
15     NameType m_Name;
16     AgeType m_Age;
17 };
18 
19 void test()
20 {
21     //2.类模板在模板参数列表中可以有默认参数
22     Person<string>p2("Jack", 111);
23     p2.showPerson();
24 }
复制代码

类模板中成员函数创建时机:

  普通类中的成员函数一开始就可以创建

  类模板中的成员函数在调用时才创建    

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 class Person1
 4 {
 5 public:
 6     void showPerson1()
 7     {
 8         cout << "Person1 show" << endl;
 9     }
10 };
11 class Person2
12 {
13 public:
14     void showPerson2()
15     {
16         cout << "Person2 show" << endl;
17     }
18 };
19 template<class T>
20 class MyClass
21 {
22 public:
23     T obj;
24     void func1()
25     {
26         //obj无法确认是什么数据类型
27         obj.showPerson1();//未调用 不会被创建 可以编译通过
28     }
29     void func2()
30     {
31         obj.showPerson2();//未调用 不会被创建 可以编译通过
32     }
33 };
34 int main()
35 {
36     system("pause");
37     return 0;
38 }
复制代码

添加test函数后:

复制代码
 1 #include <iostream>
 2 using namespace std;
 3 class Person1
 4 {
 5 public:
 6     void showPerson1()
 7     {
 8         cout << "Person1 show" << endl;
 9     }
10 };
11 class Person2
12 {
13 public:
14     void showPerson2()
15     {
16         cout << "Person2 show" << endl;
17     }
18 };
19 template<class T>
20 class MyClass
21 {
22 public:
23     T obj;
24     void func1()
25     {
26         obj.showPerson1();
27     }
28     void func2()
29     {
30         obj.showPerson2();
31     }
32 };
33 
34 void test()
35 {
36     MyClass<Person1>m;
37     m.func1();//注释m.fun2()   可以运行
38     m.func2();//无法运行  Person1无showPerson2()
39 }
40 int main()
41 {
42     test();
43     system("pause");
44     return 0;
45 }
复制代码

总结:类模板的成员函数不是一开始就创建的,在调用时才去创建

posted on   廿陆  阅读(27)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示