类模板的定义及其使用


本次引入类模板及其基本运算,为之后的一个关于栈的应用做铺垫。

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换成我们所需要的数据类型,再做些微小的改动就成为了一个普通的类。认识到这一点,对类模板的理解就会更加深刻。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM