上一篇文章中详细介绍了函数模板的内容,今天继续来给大家详细描述如何来使用类模板。以下内容大多为学习过程中的心得体会与总结分享给大家,如有错误欢迎大家批评指正!感谢!
目录
二. 类模板
当我们想建立一个类,并且希望这个类中的成员变量可以是任意类型的数据,这种情况下,我们就可以通过类模板的方式来实现这种功能。与函数模板相类似,通过类模板来建立一个通用的类,这个类中的成员变量的类型可以是任意的。
类模板不是一个实际的类型,是虚拟的,就像一个ppt的模板。类模板只有在实例化的时候才会构建类,而不是在编译的时候构建类,和函数模板一样。
2.1 定义一个类模板
定义格式: template<typename T>
class person { T age; };
实例化格式:类名 <类型> 对象名(参数);
#include <iostream>
using namespace std;
template <typename T>
class person
{
public:
T age;
};
int main(int argc, char const *argv[])
{
person<int> people; //通过无参构造的方式构建一个名叫people的对象
return 0; //即使没有传入参数,也必须指定模板中T的具体类型
}
注意:
1. 函数模板可以使用隐式类型推导,但类模板不可以,必须是显示推导,所以上段代码中即使是无参构造,也必须给模板中的T指定一个类型。
2. 类模板在定义template时候,可以加上默认类型参数。template<class T1,class T2=string>在模板中的默认参数类型中,如果所有模板参数都是缺省,但在类进行实例化的时候,尖括号不可以省略。
2.2 类模板继承
1. 普通类之间的继承:class son : public father{}
2. 模板类继承:
普通子类继承模板类:格式:class 子类:public 父类 <指定类型>
构建对象:和普通对象的构建一样:类名 对象名(参数列表);
类模板继承类模板
格式: template<class T1,class T2>
class son : public person <T1,T2> { }
#include <iostream>
using namespace std;
template <typename T>
class father
{
public:
T age;
};
class son : public father<int> //普通子类继承父类,必须指定一个类型
{
public:
int num;
};
template <typename T1, typename T2>
class child : public father<T1> //类模板继承类模板,可以用子类中类型指定父类T类型
{
public:
int num;
};
int main(int argc, char const *argv[])
{
son son1; //定义一个普通类继承模板类对象
child<int, char> child1; //定义一个模板类继承模板类对象
return 0;
}
2.3 类模板成员函数在类内声明类外定义
与普通类的成员函数不同,类模板中的成员函数,如果想要在在类内声明,在类外定义的话需要加上模板的类限定符。
#include <iostream>
using namespace std;
template <typename T>
class person
{
public:
T age;
void fun(T value);
};
template <typename T>
void person<T>::fun(T value)
{
cout << "我是模板类的类外函数" << endl;
}
int main(int argc, char const *argv[])
{
person <int> p;
p.fun(1);
return 0;
}
2.4 类模板的友元函数
1. 类外实现友元函数:
先需要在类内声明函数,声明的时候需要加空模板列表,也就是函数名后加<>
其次需要在类外实现,但一定是类的定义前实现,在friend函数声明前需要有函数体。
最后在定义完友元函数后,需要先声明模板类。
2. 类内实现模板类的友元函数,和普通友元函数实现一样。