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 }
总结:类模板的成员函数不是一开始就创建的,在调用时才去创建
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)