c++学习笔记之类模板

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 更是经典之作。

posted @ 2019-07-11 15:14  小公鸡  阅读(226)  评论(0编辑  收藏  举报