本次引入类模板及其基本运算,为之后的一个关于栈的应用做铺垫。
1.类模板的定义:
可用类模板来定义类,类模板是对象特性更为一般的抽象。简而言之,一个类模板就是一个抽象的类、类模板的一般定义形式为:
template<参数名列表> class 类名{ //类的说明 };
其中,template是关键字,<参数名列表>中可以有多个参数,多个模板参数之间用逗号分隔。模板参数的形式可以是:
class<标识符> 或 类型表达式<标识符>
如,可定义坐标点的类模板如下:
template <class T> //带参数T的类模板说明 class Point{ public: Point(T = 0,T = 0); //类的构造函数 Point(Point&); //类的复制构造函数 T Distance(Point&); //返回类型为T的成员函数 private: T x,y; };
2**.类模板的使用**:
使用上述模板定义对象iobj,并以int替换参数T:
Point<int> iobj(3,4); //该对象产生一个int型的点(3,4)
使用该模板再产生一个实例:
Point<double>dobj(7.8,8.8); //该对象产生一个double型的坐标点(7.8,8.8)
由此可见,使用类模板可以声明不同类型的对象。对于一个可能用到多种数据类型的类来说,使用类模板可以大大提高编程的效率。简单地说,如果你需要int型的数据,就用int来替换参数模板中的T,需要double型的数据就用double来替换参数模板中的T。
以下代码给出了一个用类模板来描述坐标点的例子:
#include<iostream> #include<cmath> //The declaration of class template template<class T> class Point{ public: Point(T = 0,T = 0); Point(Point&); T Distance(Point&); private: T x,y; }; //The implementation of class template Point template<class T> Point<T>::Point(T a,T b):x(a),y(b){} template<class T> Point<T>::Point(Point& a) { x = a.x; y = a.y; } template<class T> T Point<T>::Distance(Point& a) { return sqrt((x - a.x)*(x - a.x) + (y - a.y)*(y - a.y)); } //main function int main() { using namespace std; //Learn the meaning of "namespace" from 《C++ primer》 Point<int>a1(3,4),a2(5,6); cout<<"The distance of these two points(int): "<<a1.Distance(a2)<<endl; Point<double>b1(7.8,9.8),b2(34.8,25.4); cout<<"The distance of these two points(double): "<<b1.Distance(b2)<<endl; return 0; }
下图为运行结果:
显然,使用类模板能使得我们在处理需要多种数据类型的类时游刃有余,从上述程序中我们也很容易发现类模板与普通的类之间的差别。其实,只要去掉类模板的声明,并将T换成我们所需要的数据类型,再做些微小的改动就成为了一个普通的类。认识到这一点,对类模板的理解就会更加深刻。
来源:https://www.cnblogs.com/larryking/p/5734457.html