0
点赞
收藏
分享

微信扫一扫

C++类模板(一)


C++ 除了支持函数模板,还支持类模板(Class Template)。函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。

声明类模板的语法为:

template<typename 类型参数1 , typename 类型参数2 , …> class 类名{
//TODO:
};

类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来讲它们没有任何区别),后跟类型参数;类型参数不能为空,多个类型参数用逗号隔开。

一但声明了类模板,就可以将类型参数用于类的成员函数和成员变量了。换句话说,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。

假如我们现在要定义一个类来表示坐标,要求坐标的数据类型可以是整数、小数和字符串,例如:

  • x = 10、y = 10
  • x = 12.88、y = 129.65
  • x = “东经180度”、y = “北纬210度”

这个时候就可以使用类模板,请看下面的代码

#include <iostream>
using namespace std;

template <class T1,typename T2> class Point{

public:
Point(T1 x,T2 y):m_x(x),m_y(y){};

T1 getX() const;//获取x坐标
void setX(T1 x);//设置x坐标
T2 getY() const;//获取y坐标
void setY(T2 y); //设置y坐标


private:
T1 m_x; //x坐标
T2 m_y; //y坐标
};


template <class T1,class T2> //模板头
//函数头
T1 Point<T1,T2>::getX() const {
return m_x;
}


template <class T1,class T2> //模板头

//函数头
void Point<T1,T2>::setX(T1 x) {
m_x=x;
}

template <class T1,class T2> //模板头
//函数头
T2 Point<T1,T2>::getY() const {
return m_y;
}

template <class T1,class T2> //模板头

//函数头
void Point<T1,T2>::setY(T2 y) {
m_y=y;
}


int main(){

Point <int,int > p1(10,20);
cout <<"x="<<p1.getX()<<", y="<<p1.getY()<<endl;

Point <int,char *> p2(10,"东经180度");
cout <<"x="<<p2.getX()<<", y="<<p2.getY()<<endl;

Point <char *,char *> p3("东经180度","北纬38度");
cout <<"x="<<p3.getX()<<", y="<<p3.getY()<<endl;


return 0;

}

在定义类型参数时我们使用了 class,而不是 typename,这样做的目的是让读者对两种写法都熟悉。


举报

相关推荐

0 条评论