概念
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;
}
结果:
(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
请登录后发表评论
注册