C++语法18-类模板与类函数

所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回类型和形参类型不具体指定,用一个虚拟的类型来代表。使用类模板定义对象时,系统会根据实参的类型来取代模板中虚拟类型从而实现了不同类的功能。

定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,后面是尖括号括起来的模板参数,然后是类名,其格式如下:

1
2
3
4
template<typename 类型参数>
class 类名{
类成员声明
};

也可以定义成如下形式:

1
2
3
4
template<class 类型参数>
class 类名{
类成员声明
};

与函数模板类似,其中,template是一个声明模板的关键字,它表示声明一个模板。类型参数(通常用C++标示符表示,如T、Type等)实际上是一个虚拟的类型名,现在并未指定它是哪一种具体的类型,但使用类模板时,必须将类型参数实例化。类型参数前需要加关键字typename(或class),typename和class作用相同,都是表示其后的参数是一个虚拟的类型名(即类型参数)。

在声明中,预采用通用数据类型的数据成员、成员函数的参数或返回类型前面需要加上类型参数。

用类模板定义对象时,采用以下形式:

类模板名 <实际类型名>对象名[(实参表列)];

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
类模板的使用举例
#include<iostream>
using namespace std;
template<typename T>
class Compare{
public:
Compare(T a,T b){
x=a;y=b;
}
T max(){
return (x>y)?x:y;
}
private:
T x,y;
};
int main(){
Compare<int> com1(3,7);
Compare<double> com2(12.34,56.78);
Compare<char> com3('a','x');
cout<<"其中的最大值是:"<<com1.max()<<nedl;
cout<<"其中的最大值是:"<<com2.max()<<endl;
cout<<"其中的最大值是:"<<com3.max()<<endl;

return 0;
}

说明:类模板中的成员函数也可以在类模板体外进行定义。此时,若成员函数中有类型参数存在,则C++有以下一些特殊的规定:

(1)需要在成员函数定义之前进行模板声明;

(2)在成员函数名前缀上“类名<类型参数>::”。

在类模板体外定义的成员函数的一般形式如下:

1
2
3
4
template<typename 类型参数>
函数类型 类名<类型参数>::成员函数名(形参表){
...
}
-------------The End-------------
0%