有时候在设计程序的时候会遇到这样一种情况:需要设计的几个类,其功能都是一样的,仅仅只是需要操作的数据类型不同。遇到这样的情况,固然可以将所有的类都设计一遍,但是在C++中,我们有更好的方法:设计一个模板类。假设我们需要创建一个数组类,该数组可能是整型数组,也可能是double类型数组、string类型数组等,为此我们需要设计一个数组的模板类。
例1:
template< class T > class array { public: array( int ); T & operator[]( int ); const T & operator[] ( int )const; int getlen()const{ return length; } ~array(); private: array(){}; int length; T * num; };template < class T >
array< T >::array( int n )
{
num = new T[n];
length = n;
}template < class T >
array< T >::~array()
{
delete[] num;
}template< class T >
T & array< T > ::operator[] (int i)
{
if( i < 0 || i >= length)
throw string("out of bounds");
return num[i];
}template< class T >
const T & array< T > ::operator[] (int i) const
{
if( i < 0 || i >= length)
throw string("out of bounds");
return num[i];
}template< class T >
ostream & operator<<(ostream & out, const array & A)
{
for(int i=0; i < A.getlen(); i++)
out<< A[i] << " ";
return out;
}
在本例中,我们定义了一个数组的模板类 array,借用该示例,我们来了解一下模板类的一些基本语法。在本例中我们定义模板类 array 时,前面加上了一句声明:
template< class T >
该语句称为模板头,可以单独放在一行,也可以与后面的 class array 同放在一行,这都没有关系。模板头中的“T”我们称之为类参数,类参数表示将会以确定的数据类型替代之,任何有效的 C++ 标识符均可以作为类参数,当然通常我们还是会用“T”来做类参数。
模板头中 template 关键字和“<”之间可以保留一个空格,但通常这两者之间不留空格。
对于模板类而言,在类外定义类中的成员函数的时候都需要加上模板头。同时由于 array 是个模板类,因此类名是 array< T >,故而在类外定义带参构造函数的完整形式是:
template < class T > T & array< T >::array( int n ) { num = new T[n]; length = n; }
而如果是在类内部定义该函数,则会相对简单一些:
array( int n ) { num = new T[n]; length = n; }
在本例中用到了前面所介绍的很多知识点,例如将默认构造函数置为 private 属性,重载下标操作符,重载输出操作符等,这些知识点希望能够仔细领会。
模板类至少有一个类参数,但是可以有多个类参数,每一个类参数前都必须有关键字 class 或者类型名。
例 2:
template< class T, class S, class R> class test { public: S fun( R r); private: T x; };
本例就是一个具有多个类参数的模板类示例。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于