C++——类模板 – 作者:Johnson666

概念

C++程序主要是由类和类的成员函数组成,编程人员需要设计各种类和它们的成员函数,然后将它们按一定的程序结构组织起来。由于现实中某些事物之间存在一定的相似性,对这些事物设计的类或者类成员函数之间也会表现出相似性,编程人员就需要编写多个形式和功能相似的函数,这造成了程序冗余的问题。C++通过引入类模板的概念解决了上述问题。利用C++的类模板,能够快速建立具有类型安全的类库集合,它能够显著提高编程效率,并提高软件的通用性和灵活性。
比如,声明一个类进行数据的初始化和求和操作,成员变量可能存在整型、浮点型、字符型等多种不同的类型,这样需要声明多个不同名的类来进行操作。但是,每个类只有变量的类型不同,类的成员函数以及类的结构完全相同。以非类模板编写的代码,如下所示。
对于整数求和的写法如下:

class add_int
{
public:
    add_int(int a, int b){x=a;y=b;}
    int sum(){return x + y;}
private:
    int x, y;
};

对于浮点数求和的写法如下:

class add_float
{
public:
    add_float(float a, float b){x=a;y=b;}
    float sum(){return x + y;}
private:
    float x, y;
};

上述例子用类模板来设计将会更加方便。类模板是能根据不同参数建立不同类型成员的类。类模板中的成员变量、成员函数的参数、成员函数的返回值可以取不同类型,在实例化成对象时,根据传入的参数类型,实例化成具体类型的对象。

类模板的定义

类模板的一般形式为:

template<class T1,class T2,……>
class 类模板名
{
    成员函数和成员变量
};

其中template为模板关键字;T1,T2是类的模板参数。在一个类模板中,可以定义多个不同的模板参数。<>中的class可以用typename代替,表示其后的参数可以是任何类型,它与类名的class具有不同的含义。
根据类模板的知识,修改上述类的声明如下:

template<class T1, class T2>
class add
{
public:
    add(T1 a, T2 b){x = a;y = b;}
    T2 sum(){return x + y;}
private:
    T1 x;
    T2 y;
};

类模板的成员函数还可以在类外定义,其一般形式为:

template<class T1, class T2,……>
类型 类名<模板参数名表>::函数名(参数表)
{
    函数体
}

例如上面的sum成员函数在类外实现如下:

template<class T1, class T2>
T2 add<T1, T2>::sum()
{
    return x + y;
}

类模板的实例化

一个类模板是具体类的抽象,在使用类模板建立对象时,会根据给定的模板参数值实例化具体的类,然后由类建立对象。类模板实例化的一般形式为:
类模板名<模板参数值表>对象1,对象2,……,对象n;
其中模板参数值表的值为类型名,例如是两个整型就写为<int,int>。模板参数值表的值按一一对应的顺序实例化类模板的模板参数值表。

例子:类模板的完整实现。

#include<iostream>

using namespace std;

template<class T1, class T2>

class add
{
	public:
		add(T1 a, T2 b)
		{
			x = a;
			y = b;
		}
		T2 sum();

	private:
		T1 x;
		T2 y;
};

template<class T1, class T2>
T2 add<T1, T2>::sum()
{
	return x + y;
}

int main()
{
	add<int, float>a(3, 4.5);
	cout << a.sum() << endl;
	add<char, int>b('A', 32);
	cout << b.sum() << endl;
	return 0;
}

结果:
image.png
(1)定义类模板在程序开始必须加上template<class T1, class T2>,其中T1,T2是虚拟数据类型参数名;add(T1 a, T2 b)中形参变量a和b分别定义为T1,T2类型。
(2)类模板里的私有成员变量x,y分别声明为T1,T2类型。
(3)在主函数中用类模板定义对象add<int, float>a(3, 4.5),将用int取代T1类型,float取代T2类型。

来源:freebuf.com 2021-06-25 22:40:29 by: Johnson666

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论