2.和函数模板一样,类模板就是建立一个通用类,其数据成员的类型、成员函数的返回类型和参数类型都不具体指定,用一个虚拟类型来代表。当使用类模板建立对象时,系统会根据实参的类型来取代类模板中的虚拟类型从而实现不同类的功能。其定义格式为:
template <typename 类型参数>
class 类名
{类成员声明}
或
template <class 类型参数>
class 类名
{类成员声明}
在类成员声明里,成员数据类型、成员函数的返回类型和参数类型前面需加上类型参数。在类模板中成员函数既可以定义在类模板内,也可以定义在类模板外,在定义类模板外时C++有这样的规定:需要在成员函数定义之前进行模板声明,且在成员函数名之前加上“类名<类型参数>::”:
template <typename(class) 类型参数>
返回类型 类名<类型参数>::函数名(形参)
{函数体}
而类模板定义对象的形式:
类模板名<实际类型> 对象名;
类模板名<实际类型> 对象名(实参);
示例说明如下:
View Code
1 #include "stdafx.h"
2 #include <iostream>
3 #include <string>
4
5 template <typename T>//在类模板定义之前,都需要加上模板声明
6 class BinaryOperation//二目运算类
7 {
8 private:
9 T x;
10 T y;
11 char op;
12 void add()
13 {
14 std::cout<<x<<op<<y<<"="<<x+y<<std::endl;
15 }
16 void sub()
17 {
18 std::cout<<x<<op<<y<<"="<<x-y<<std::endl;
19 }
20 void mul();
21 void div();
22 public:
23 BinaryOperation(T x,T y):x(x),y(y)
24 {
25 }
26 void determineOp(char op);
27 };
28
29
30 //在类外定义成员函数:
31 //在成员函数定义之前进行模板声明,
32 //且在成员函数名之前加上"类名<类型参数>::"
33 template <typename T>
34 void BinaryOperation <typename T>::mul()
35 {
36 std::cout<<x<<op<<y<<"="<<x*y<<std::endl;
37 }
38
39 template <typename T>
40 void BinaryOperation <typename T>::div()
41 {
42
43 std::cout<<x<<op<<y<<"="<<x/y<<std::endl;
44 }
45
46 template <typename T>
47 void BinaryOperation <typename T>::determineOp(char op)
48 {
49 this->op=op;
50 switch(op)
51 {
52 case'+':
53 add();
54 break;
55 case'-':
56 sub();
57 break;
58 case'*':
59 mul();
60 break;
61 case'/':
62 div();
63 break;
64 default:
65 break;
66 }
67 }
68
69 int main()
70 {
71
72 BinaryOperation<int> op(10,10);
73 op.determineOp('+');
74 op.determineOp('-');
75 op.determineOp('*');
76 op.determineOp('/');
77
78 return0;
79 }
结果:
10+10=20 10-10 = 0 10*10=100 10/10=1
和函数模板一样,类模板也允许定义多个类型参数,这里不再一一举例了,有兴趣的朋友可以参考上述的示例代码尝试一下。