第58课 类模板的概念和意义

思考:

在C++中能否将泛型的思想应用到类呢?

类模板:

类模板的应用:

实验:

 1 #include <iostream>
 2 #include <string>
 3 
 4 using namespace std;
 5 
 6 template < typename T >
 7 class Operator
 8 {
 9 public:
10     T add(T a, T b)
11     {
12         return a + b;
13     }
14     T minus(T a, T b)
15     {
16         return a - b;
17     }
18     T multiply(T a, T b)
19     {
20         return a * b;
21     }
22     T divide(T a, T b)
23     {
24         return a / b;
25     }
26 };
27 
28 string operator-(string& l, string& r)
29 {
30     return "Minus";
31 }
32 
33 int main()
34 {
35     Operator<int> op1;
36     
37     cout << op1.add(1, 2) << endl;
38     
39     Operator<string> op2;
40     
41     cout << op2.add("D.T.", "Software") << endl;
42     cout << op2.minus("D.T", "Software") << endl;
43     
44     return 0;
45 }

运行结果如下:

编译器编译到16行发现两个string类型相减,而string类本身不支持这种相减操作,于是编译器去找string类型减法的重载,于是找到了28行的函数,最终编译成功,执行时也调用到了28行的重载函数。

类模板的工程应用:

这三条是工程的惯用规则。

示例:

Operator.h

 1 #ifndef _OPERATOR_H_
 2 #define _OPERATOR_H_
 3 
 4 template < typename T >
 5 class Operator
 6 {
 7 public:
 8     T add(T a, T b);
 9     T minus(T a, T b);
10     T multiply(T a, T b);
11     T divide(T a, T b);
12 };
13 
14 template < typename T >
15 T Operator<T>::add(T a, T b)
16 {
17     return a + b;
18 }
19 
20 
21 template < typename T >
22 T Operator<T>::minus(T a, T b)
23 {
24     return a - b;
25 }
26 
27 
28 template < typename T >
29 T Operator<T>::multiply(T a, T b)
30 {
31     return a * b;
32 }
33 
34 
35 template < typename T >
36 T Operator<T>::divide(T a, T b)
37 {
38     return a / b;
39 }
40 
41 #endif

main.c

 1 #include <iostream>
 2 #include <string>
 3 #include "Operator.h"
 4 
 5 using namespace std;
 6 
 7 
 8 int main()
 9 {
10     Operator<int> op1;
11     
12     cout << op1.add(1, 2) << endl;
13     cout << op1.multiply(4, 5) << endl;
14     cout << op1.minus(5, 6) << endl;
15     cout << op1.divide(10, 5) << endl;
16     
17     return 0;
18 }

放到类模板外部定义成员函数时,依然要加上template这一行。

运行结果:

 

小结:

猜你喜欢

转载自www.cnblogs.com/wanmeishenghuo/p/9589158.html