C++ 除了支持函数模板,还支持类模板(Class Template)。函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中。类模板的目的同样是将数据的类型参数化。
声明类模板的语法为:
template<typename 类型参数1 , typename 类型参数2 , …> class 类名{ //TODO: };
类模板和函数模板都是以 template 开头(当然也可以使用 class,目前来讲它们没有任何区别),后跟类型参数;类型参数不能为空,多个类型参数用逗号隔开。
一但声明了类模板,就可以将类型参数用于类的成员函数和成员变量了。换句话说,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。
template<typename T1, typename T2> //这里不能有分号 class Point{ public: Point(T1 x, T2 y): m_x(x), m_y(y){ } public: 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坐标 };
综合示例
1 #include <iostream> 2 using namespace std; 3 4 template<class T1, class T2> //这里不能有分号 5 class Point{ 6 public: 7 Point(T1 x, T2 y): m_x(x), m_y(y){ } 8 public: 9 T1 getX() const; //获取x坐标 10 void setX(T1 x); //设置x坐标 11 T2 getY() const; //获取y坐标 12 void setY(T2 y); //设置y坐标 13 private: 14 T1 m_x; //x坐标 15 T2 m_y; //y坐标 16 }; 17 18 template<class T1, class T2> //模板头 19 T1 Point<T1, T2>::getX() const /*函数头*/ { 20 return m_x; 21 } 22 23 template<class T1, class T2> 24 void Point<T1, T2>::setX(T1 x){ 25 m_x = x; 26 } 27 28 template<class T1, class T2> 29 T2 Point<T1, T2>::getY() const{ 30 return m_y; 31 } 32 33 template<class T1, class T2> 34 void Point<T1, T2>::setY(T2 y){ 35 m_y = y; 36 } 37 38 int main(){ 39 Point<int, int> p1(10, 20); 40 cout<<"x="<<p1.getX()<<", y="<<p1.getY()<<endl; 41 42 Point<int, char*> p2(10, "东经180度"); 43 cout<<"x="<<p2.getX()<<", y="<<p2.getY()<<endl; 44 45 Point<char*, char*> *p3 = new Point<char*, char*>("东经180度", "北纬210度"); 46 cout<<"x="<<p3->getX()<<", y="<<p3->getY()<<endl; 47 48 return 0; 49 }
运行结果:
x=10, y=20 x=10, y=东经180度 x=东经180度, y=北纬210度
模板所支持的类型是宽泛的,没有限制的,我们可以使用任意类型来替换,这种编程方式称为泛型编程(Generic Programming)。相应地,可以将参数 T 看做是一个泛型,而将 int、float、string 等看做是一种具体的类型。除了 C++,Java、C#、Pascal(Delphi)也都支持泛型编程。
C++ 模板也是被迫推出的,最直接的动力来源于对数据结构的封装。数据结构关注的是数据的存储,以及存储后如何进行增加、删除、修改和查询操作,它是一门基础性的学科,在实际开发中有着非常广泛的应用。C++ 开发者们希望为线性表、链表、图、树等常见的数据结构都定义一个类,并把它们加入到标准库中,这样以后程序员就不用重复造轮子了,直接拿来使用即可。
C++ 模板有着复杂的语法,可不仅仅是前面两节讲到的那么简单,它的话题可以写一本书。C++ 模板也非常重要,整个标准库几乎都是使用模板来开发的,STL 更是经典之作。