类模板语法
类模板作用:
- 建立一个通用类,类中的成员 数据类型可以不具体制定,用一个虚拟的类型来代表。
语法:
template<typename T>类
解释:
template — 声明创建模板
typename — 表面其后面的符号是一种数据类型,可以用class代替
T — 通用的数据类型,名称可以替换,通常为大写字母
template<class NameType, class AgeType>class Person {public:Person(NameType name,AgeType age) {this->m_Age = age;this->m_Name = name;};void ShowPerson() {cout << "name: " << this->m_Name << " age: " << this->m_Age << endl;}NameType m_Name;AgeType m_Age;};void example() {Person<string, int> p1("Tom", 18);//尖括号的内容是模板参数列表p1.ShowPerson();}
类模板和函数模板的区别
- 类模板没有自动类型推导的使用方式
类模板在模板的参数列表中可以有默认参数。
template <class NameType,class AgeType = int>class Person {public:Person(NameType name,AgeType age) {this->m_age = age;this->m_name = name;}void showPerson() {cout << "name: " << this->m_name << " age:" << this->m_age << endl;}NameType m_name;AgeType m_age;};void example() {Person<string, int> p("Tom", 100);//因为类模板不能自动类型推导,只能用显示数据类型p.showPerson();//We could have a default type here, so we don't have to point onePerson <string> p2("Jack", 10);}
类模板中的成员函数创建时机
二者创建的时机有区别。
普通类的成员函数一开始就可以创建
但是类模板的成员函数在调用的时候才创建。
class Person1{public:void showPerson1(){cout << "Person1 show" << endl;}};class Person2{public:void showPerson2(){cout << "Person2 show" << endl;}};template<class T>class MyClass{public:T obj;//类模板中的成员函数,并不是一开始就创建的,而是在模板调用时再生成void fun1() { obj.showPerson1(); }void fun2() { obj.showPerson2(); }};void test01(){MyClass<Person1> m;m.fun1();//m.fun2();//编译会出错,说明函数调用才会去创建成员函数}int main() {test01();system("pause");return 0;}
上述代码在不进行实例化的时候,模板类不会被创建,所以不存在Myclass这个类,编译正常通过,如果将其实例化,则无法编译通过。
类模板对象做函数参数
制定传入的类型 —直接显示对象的数据类型
- 参数模板化 —将对象中的参数变为模板进行传递
- 整个类模板化 —将这个对象类型 模板化进行传递 ```cpp
template
打印结果是:```cppname= 张三 age= 18name= 李四 age= 20T1的类型是class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >T2的类型是intname= 王五 age= 25T的数据类型是:class Person<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,int>
