写在前面
许多初学者在刚刚接触到c++类模板的时候都会产生疑惑,而现有的资料大多对初学者来说比较难懂,本文旨在用通俗易懂的语言帮助初学者把C++类模板理解透彻。
场景搭建
假设有如下场景,定义类A、B、C
class A
{
public:
A(){}
~A(){}
void print(){
cout << m << endl;
}
int m;
};
class B
{
public:
B(){}
~B(){}
void print(){
cout << m << endl;
}
char m;
};
class C
{
public:
C(){}
~C(){}
void print(){
cout << m << endl;
}
double m;
};
观察上面的代码,我们可以发现,类A、B、C除了变量m的数据类型不同外,其他内容完全相同,那么我们何必要多定义两个类呢?岂不是浪费笔墨纸张? 我们是否可以定义一个特殊的类,这个类与数据类型无关,当我们要使用这个类的时候再给它一个数据类型、把它具体化?
C++给我们提供了这样的一个语法,让我们去实现这样的一个类,我们把它称为类模板。
基本语法
我们可以在类的前面加上关键字templete <typename 参数名>
来告诉编译器,这是一个类模板。
因此,上面案例就可以写为:
// 有两种写法 :
// templete <typename T> 和 templete <class T>
// 这两种写法没有区别,笔者更习惯使用前者
templete <typename T>
class A
{
public:
A(){}
~A(){}
void print(){
cout << m << endl;
}
T m;
};
我们要怎么使用呢?很简单,只需要在定义变量的时候说明数据类型,借用上边的例子:
#include <iostream>
using namespace std;
//定义模板类 A
templete <typename T>
class A
{
public:
A(){}
~A(){}
void print(){
cout << m << endl;
}
T m;
};
int main()
{
A<int> a1;
A<char> a2;
A<double> a3;
return 0;
}
如果一个模板类中需要多个数据类型该怎么办呢? 我们可以这样:
#include <iostream>
using namespace std;
templete <typename T1,typename T2>
class A
{
public:
A(){}
~A(){}
void print(){
cout << m << n << endl;
}
T1 m;
T2 n;
// 类模板中可以定义具体的数据类型,例如:
int x; char y; double z;
};
int main()
{
A<int,char> a1;
a1.m=10;
a1.n='a';
a1.print();
return 0;
}
在这个例子中,A为类模板,用A定义的a1为模板类,模板类是类模板具体化
至此,我们就可以定义一个类模板,将类的定义独立于任何特定数据类型。
在下一篇中,我将会讲述如何进行类模板的构造、析构。