类模板
语法:template <T…> 紧跟着是类
区别:
- 与函数模板区别,可以有默认类型参数
- 函数模板可以进行自动类型推导,而类模板不可以
类模板中的成员函数 一开始不会创建出来,而是在运行时才去创建
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //类模板 template<class NameT, class AgeT=int> //类模板可以有默认类型 class Person { public: Person(NameT name, AgeT age) { this->m_Name = name; this->m_Age = age; } NameT m_Name; AgeT m_Age; }; void test01() { //1.类模板不支持 自动类型推导 //Person p("孙悟空", 100); //error //2.显示类型指定 Person<string, int> p("孙悟空", 100); } int main() { test01(); system("Pause"); return 0; }
成员函数运行时才创建
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> using namespace std; //类模板 template<class NameT, class AgeT=int> //类模板可以有默认类型 class Person { public: Person(NameT name, AgeT age) { this->m_Name = name; this->m_Age = age; } NameT m_Name; AgeT m_Age; }; void test01() { //1.类模板不支持 自动类型推导 //Person p("孙悟空", 100); //error //2.显示类型指定 Person<string, int> p("孙悟空", 100); } class Person1 { public: void showPerson1() { cout << "Person1显示" << endl; } }; class Person2 { public: void showPerson2() { cout << "Person2显示" << endl; } }; template<class T> class myClass { public: T obj; void func1() { obj.showPerson1(); } void func2() { obj.showPerson2(); } }; //成员函数 一开始不会创建出来 而是运行时才会被创建出来 void test02() { myClass<Person1> m; //此时运行 不会报错 m.func1(); //正常 //m.func2(); //error 只有运行到这才会报错 } int main() { test02(); //test01(); system("Pause"); return 0; }
结果:
调用func2时才会报错
结果: