C++类模板详解(一)

写在前面

许多初学者在刚刚接触到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为模板类,模板类是类模板具体化
至此,我们就可以定义一个类模板,将类的定义独立于任何特定数据类型。
在下一篇中,我将会讲述如何进行类模板的构造、析构。

发布了2 篇原创文章 · 获赞 3 · 访问量 1639

猜你喜欢

转载自blog.csdn.net/qq_38446221/article/details/104170416