• C++模板简介


      模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。

      模板是一种对类型进行参数化的工具;

      通常有两种形式:函数模板类模板

      函数模板针对仅参数类型不同的函数

      类模板针对仅数据成员成员函数类型不同的类。

      使用模板的目的就是能够让程序员编写与类型无关的代码比如编写了一个交换两个整型int 类型的swap函数,这个函数就只能实现int 型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int 型,又可以实现double型的交换。模板可以应用于函数和类。下面分别介绍。

      注意:模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

    1.函数模板:

    Template <class或者也可以用typename T>

    返回类型 函数名(形参表)
    {//函数定义体 }

    说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,如果类型形参多余一个 ,每个形参前都要加class <类型 形参表>可以包含基本数据类型可以包含类类型.

     请看以下程序:

    //Test.cpp
    #include <iostream>
    using std::cout;
    using std::endl;
    //声明一个函数模版,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替,
    //T可以被任何字母或者数字代替。
    template <class T>
    T min(T x,T y)
    { return(x<y)?x:y;}
    void main( )
    {
         int n1=2,n2=10;
         double d1=1.5,d2=5.6;
         cout<< "较小整数:"<<min(n1,n2)<<endl;
         cout<< "较小实数:"<<min(d1,d2)<<endl;
         system("PAUSE");
    }

    2.类模板:

    定义一个类模板:

    Template < class或者也可以用typename T >
    class类名{
    //类定义......
    };

    说明:其中,template是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。

    例如:定义一个类模板:

    #ifndef ClassTemplate_HH
    #define ClassTemplate_HH
    template<typename T1,typename T2>
    class myClass{
    private:
         T1 I;
         T2 J;
    public:
         myClass(T1 a, T2 b);//Constructor
         void show();
    };
     
    //这是构造函数
    //注意这些格式
    template <typename T1,typename T2>
    myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
    //这是void show();
    template <typename T1,typename T2>
    void myClass<T1,T2>::show()
    {
         cout<<"I="<<I<<", J="<<J<<endl;
    }
    
    #endif
    // Test.cpp
    #include <iostream>
    #include "ClassTemplate.h"
    using std::cout;
    using std::endl;
    void main()
    {
         myClass<int,int> class1(3,5);
         class1.show();
         myClass<int,char> class2(3,'a');
         class2.show();
         myClass<double,int> class3(2.9,10);
         class3.show();
         system("PAUSE");
    
    }

    3.非类型模板参数

    一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。

    那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。

    template<typename T, int MAXSIZE>
    class Stack{
    Private:
        T elems[MAXSIZE];
    };
    int main()
    {
        Stack<int, 20> int20Stack;
        Stack<int, 40> int40Stack;
    };

     

  • 相关阅读:
    『实践』Yalmip建模+Cplex类求解(文末附程序、文章和算例)
    『实践』Matlab实现Flyod求最短距离及存储最优路径
    『转载』Matlab中fmincon函数获取乘子
    『实践』Yalmip获取对偶函数乘子
    『转载』hadoop 1.X到2.X的变化
    『转载』hadoop2.x常用端口、定义方法及默认端口
    『实践』VirtualBox 5.1.18+Centos 6.8+hadoop 2.7.3搭建hadoop完全分布式集群及基于HDFS的网盘实现
    C#设计模式学习笔记:(6)适配器模式
    ASP.NET 开源导入导出库Magicodes.IE 导出Pdf教程
    Rx基础
  • 原文地址:https://www.cnblogs.com/RainyBear/p/5243323.html
Copyright © 2020-2023  润新知