这篇开始学习类模板相关知识,本篇主要学习什么是类模板,还有类模板和函数模板的区别
1.类模板语法
template <class T>类
模板声明下面是函数就是函数模板,如果是类就叫类模板
2.一个类模板例子
下面写一个Person类 类模板,看看如何定义和如何使用类模板
#include <iostream>#include <string>using namespace std;//类模板template <class TypeName, class TypeAge>class Person{public:Person(TypeName name, TypeAge age){this->m_Name = name;this->m_Age = age;}TypeName m_Name;TypeAge m_Age;void showInfo(){cout<< "Name: " << m_Name << " Age: " << m_Age << endl;}};void test01(){Person<string, int> p1("张三", 18);p1.showInfo();}int main(){test01();system("pause");return 0;}
3. 类模板和函数模板区别
现在我们学习了类模板和函数模板,语法格式都差不多,第一行是template开头,后面跟着如果是函数,就叫函数模板,如果跟着是类,就叫类模板。那么类模板和函数模板有什么区别呢?
3.1 类模板不支持参数自动推导
前面学习过函数模板中参数,支持参数类型自动推导,这个在类模板中就不行,必须要明确给出参数类型才可以,否则报错。
上面29行语法是正确,30行编译不过去,会提示模板参数缺失。
3.2 类模板在模板参数列表可以有默认参数
上面的类模板代码中,模板参数列表有两个<string, int>,下面代码修改一下,把int设置默认参数,调用类模板的使用可以不写int,代码如下
#include <iostream>#include <string>using namespace std;//类模板template <class TypeName, class TypeAge = int>class Person{public:Person(TypeName name, TypeAge age){this->m_Name = name;this->m_Age = age;}TypeName m_Name;TypeAge m_Age;void showInfo(){cout<< "Name: " << m_Name << " Age: " << m_Age << endl;}};void test01(){Person<string> p1("张三", 18);p1.showInfo();}int main(){test01();system("pause");return 0;}
如果给定了第二个参数是int类型,所以第29行在模板参数列表中可以写成上面样子。这里设置了默认,如果模板参数不写,自然就是采用默认的int类型,如果模板参数传入了,就使用模板参数中传入的类型。