zoukankan      html  css  js  c++  java
  • 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 更是经典之作。

  • 相关阅读:
    Mysql优化(1) 存储引擎、数据类型、字符集
    Mysql常用命令(5) 增加表的字段、修改表名、备份数据库
    Mysql常用命令(4) 插入、查询、删除、修改数据
    Navicat Premium v12.1.28 中文最新破解版(附:激活工具)
    MySQL命令:创建数据库、插入数据
    mysql初始化密码错误
    mysql第一次安装成功后初始化密码操作步骤
    MYSQL安装出现问题(服务无法启动,The service already exists)
    练习4-7 求e的近似值 (15 分)
    习题3-2 高速公路超速处罚 (15 分)
  • 原文地址:https://www.cnblogs.com/chaoyingLi/p/11170157.html
Copyright © 2011-2022 走看看