类模板的定义及其使用

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

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

 

posted @ 2016-03-26 11:23  larryking  阅读(11079)  评论(0编辑  收藏  举报