C++之模板类与类模板

参考出处:https://www.cnblogs.com/assemble8086/archive/2011/10/02/2198308.html

    https://www.cnblogs.com/cxq0017/p/6076856.html

一、关于typename与class

  事实上class在C++中用于定义类,在模板引入C++中后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在两个地方使用带来混淆,所以引入了typename关键字,同class一样表明后面的符号作为一个类型,这样可以修改为以下表现形式:template<typename T>。在模板定义的语法中,关键字class与typename的作用是完全一样的。

二、关于类模板与模板类的概念

  一个类模板允许用户为类定义一种模式,使得类中的某些数据成员、默认成员函数的参数、某些成员函数的返回值,能够取任意类型。如果一个类中的数据成员的数据类型不能确定,或者是某个成员函数的参数或者返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的实际的类,而是表示一类类。

  关于类模板的定义(有两方面内容):

  1.首先定义它,其格式为:

    template<class T>

    class test

    {

    private:

      T n;

      const T i;

    public:

      Test():i(0) {}

      Test(T k);

      ~Test() {}

      void print();

      T operator+(T x);

    }

    在类test中,如果采用通用数据类型成员,函数参数的的前面需要加上T,其中通用类型T可以作为普通成员变量类型,还可以作为成员函数的参数和返回类型等。

    如果在类外定义成员函数,如果此成员函数右模板参数存在,则除了需要和一般类的类外定义成员函数一样的定义外,还需要在函数外进行模板声明。(意思是,有用模板类的话,不管是类前面 还是类外成员函数前面都需要进行模板申明)。

    关于类模板的使用:类模板的使用实际上是将类模板实例化成一个具体的类,使用格式:类名<实际的类型>。

    比如定义了一个类test,里面存在模板T,我们想实例化的话,把T变为int,可以使用test<int>。

    

  总结:

    类模板:一个在定义类的过程中使用了模板的类。

    模板类:将类模板实例化,并指定模板实际的类型。

三、类模板的定义

  template<class 模板参数>

  template<class type, int width>

  其中,template是声明类模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个,可以是类型参数,也可以是非类型参数。类型参数有关键字class或者typename及其后面的标识符构成。非类型参数由一个普通参数构成,代表模板定义的一个常量。

  注意:

  (1)如果在全局参数中声明了与模板参数同名的变量,那么该变量被隐藏掉。(其实和局部变量掩盖掉同名全局变量道理一样)

  (2)模板参数名不能够被当做类模板定义中类成员的名字。(就跟你不能使用int作为变量名一样的道理)

  (3)同一个模板参数名在模板参数表中只能出现一次。(在一个模板定义中,当然不能用同名)

  (4)在不同的类模板或声明中,模板参数名可以被重复使用。(类似于不同的函数可以定义相同的局部变量名一样)

  (5)在类模板的前向声明中,模板参数名可以被重复使用。(...不明)

  (6)类模板参数可以有缺省实参,给参数提供缺省实参的顺序是先右后左。(不明白)

  (7)类模板名可以被用作一个类型指示符。当一个类模板名被用作另一个模板定义中的类型指示符时,必须制定完整的实参表。(意思是类模板 用来定义一个类名时候,需要给定实参表,在当前类中使用,不需要,其他类中指定需要)

四、类模板实例化

  定义:从通用的类模板定义中生成类的过程称为模板实例化

  

  例如:Graphics<int> gi;

  类模板什么时候会被实例化呢?

  (1)当使用了类模板实例的名字,并且上下文环境要求存在类的定义时。

  (2)对象类型是一个类模板实例,当对象呗定义时,此点作为类的实例化点。

  (3)一个指针或者引用指向一个类模板实例,当检查这个指针或者所引用的对象时。(不甚明白)

五、非参数类型模板实参

  要点:

  (1)绑定给非类型参数的表达式必须是一个常量表达式。(???)

  (2)从模板实参到费类型模板参数的类型之间允许进行一些转换。包括左值转换、限定修饰转换、提升、整值转换。(???)

  (3)。。没读明白,不写了

六、类模板的成员函数

  要点:

  (1)类模板的成员函数可以在类模板的定义中定义(inline函数),也可以在类模板定义之外定义(但是此时成员函数定义前面必须加上template及模板参数)

  (2)类模板成员函数本身也是一个模板,类模板被实例化时,只有当它被调用获取地址才被实例化。

七、类模板的友元声明

  (友元没学好,暂时不写)

  

原文地址:https://www.cnblogs.com/cwyblogs/p/8257466.html