c++提高篇——模板(下)
- 一、类模板
- 二、类模板与函数模板区别
- 三、类模板中成员函数创建时机
- 四、类模板对象做函数参数
一、类模板
类模板可以建立一个通用类,类中的成员数据类型可以不具体制定,用一个虚拟的类型来代表。
类模板的语法如下:
template<typename 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 << "姓名为" << this->m_name << endl;
cout << "年龄为" << this->m_age << endl;
}
string m_name;
int m_age;
};
void test()
{
Person<string, int> p1("张三", 12);
p1.ShowPerson();
}
二、类模板与函数模板区别
类模板与函数模板区别主要有两点:
1.类模板没有自动类型推导的使用方式:
//类模板与函数模板的区别
template<class NameType, class AgeType>
class Person
{
public:
Person(NameType name, AgeType age)
{
this->m_name = name;
this->m_age = age;
}
void ShowPerson()
{
cout << "姓名为" << this->m_name << endl;
cout << "年龄为" << this->m_age << endl;
}
NameType m_name;
AgeType m_age;
};
void test08()
{
string name = "张三";
int age = 12;
Person p1(name, age);
}
样例代码如上,当使用如上代码时,会报如下错误:
之所以报这么错误就是因为类模板不像函数模板一样,它并不能自动推导出传入数据的类型,因此会报如上错误。
将调用类模板的代码改为:
Person<string, int>(name, age);
即可解决错误。
2.类模板在模板参数列表中可以有默认参数:
template<class NameType, class AgeType = int>
其样例如上,在定义类模板时可以指定参数列表中的默认参数类型,当我们在调用这个类时就不需要再指定默认参数的参数类型了:
Person<string>p1(name, age);
这是类模板的一个特有的功能,在函数模板中是没有这个功能的。
三、类模板中成员函数创建时机
类模板中成员函数和普通类中成员函数创建时机是有区别的:
1、普通类中的成员函数一开始就可以创建
2、类模板中的成员函数在调用时才创建
四、类模板对象做函数参数
类模板实例化出的对象,向函数传参的方式,一共有三种:
1.指定传入的类型:直接显示对象的数据类型
//类模板对象做函数参数
template<class T1, class T2>
class Person
{
public:
Person(T1 name, T2 age)
{
this->m_age = age;
this->m_name = name;
}
void ShowPerson()
{
cout << "姓名" << this->m_name << endl;
cout << "年龄" << this->m_age << endl;
}
T1 m_name;
T2 m_age;
};
//指定传入的类型
void printPerson1(Person<string, int>&p)
{
p.ShowPerson();
}
void test09()
{
Person<string, int>p1("张三", 19);
printPerson1(p1);
}
2.参数模板化:将对象中的参数变为模板进行传递,样例如下:
//参数模板化
template<class T1, class T2>
void printPerson2(Person<T1, T2>&p)
{
p.ShowPerson();
}
我们也可以查看到类模板推理出来的变量类型:
cout << "T1的类型为: " << typeid(T1).name() << endl;
cout << "T2的类型为: " << typeid(T2).name() << endl;
此时显示如下:
3.整个类模板化:将这个对象类型模板化进行传递,代码样例如下:
//整个类模板化
template<class T>
void printPerson3(T &p)
{
p.ShowPerson();
cout << "T的类型为: " << typeid(T).name() << endl;
}
此时终端会显示: