//类模板的使用 //针对不同数据类型要设计不同版本的类,但是内部的实现是一样的.这样做不但重复劳动还容易出错,后期和调试的工作量相当大.类模板解决了上述的问题. //#类模板的声明和实例化 //类模板能够为类的数据成员,成员函数的参数,返回值提供动态参数化的机制,使得用户可以方便地设计出功能更为灵活的类. /* temple <class T> class Calculate { public: Calculate(T a, T b); T Add(); T Subtraction(); private: T m_a; T m_b; }; */ //其中,第一行为模板声明.格式为template <class 类型参数名>. //template的意思是"模板", 是声明模板类时必须加上的关键字.在template后的"<>"中是参数列表,关键字class表示后面的是类型参数. //对类模板进行实例化定义类对象的时候也要注意定义的形式: //类模板名 <实际类型名> 对象名(实参列表); 例如在主程序中定义一个Calculate的整形参数对象应该为:Calculate<int> cal(20, 10); //类模板的实现 //无论是声明还是定义都少不了template关键字. //当定义类中的函数时,格式如下: /* template <参数类型列表> 返回值 类名<参数类型列表>::函数名(参数列表) {函数体内容;} */ //类模板的实现 #include "stdafx.h" #include <iostream> using namespace std; template <class T> class Compare { public: Compare(T a, T b); T Min(); T Max(); private: T num1; T num2; }; template <class T> Compare<T>::Compare(T a, T b) { num1 = a; num2 = b; } template <class T> T Compare<T>::Min() { if(num1>num2) return num2; else return num1; } template <class T> T Compare<T>::Max() { if(num1<num2) return num2; else return num1; } int main(int argc, char * argv[]) { Compare<int> com1(20.12,30); cout << "Min is:" << com1.Min() << endl; cout << "Max is:" << com1.Max() << endl; Compare<double> com2(40.51, 50); cout << "Min is:" << com2.Min() << endl; cout << "Max is:" << com2.Max() << endl; return 0; } //在上面的代码中,首先定义了一个类模板(Compare).为了使定义的类为类模板,要在类的定义前编写template<class T>.在类中声明类模板的构造函数和成员函数,并且添加两个私有成员变量num1和num2, //用来存放要进行比较的数据.类定义完之后,要对类中的成员函数进行定义,这里选择在类外进行定义.每一次定义成员函数时都要编写template<class T>,并且将其放在函数定义之前. //在主函数(main)中,可以看到当希望使用的数据是int型时,要在定义对象的同时给予声明Compare<int> com1(20, 10);. //通过这个实例可以更深刻地认识到,要在每次编写类和函数的定义时在前面加上template<class T>.