zoukankan      html  css  js  c++  java
  • 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)类模板成员函数本身也是一个模板,类模板被实例化时,只有当它被调用获取地址才被实例化。

    七、类模板的友元声明

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

      

  • 相关阅读:
    Hubble.net 值得纪念的一天
    Hubble.net 0.5 版本开发完成
    计算任意数值的阶乘
    Hubble.net 建表语句 Create Table
    Linq to SQL 插入数据时的一个问题
    盘古分词中文人名识别算法介绍
    盘古分词功能简介
    最长不完全匹配子串频率计算eaglet 的解法
    背包分组问题的解法
    SharePoint 2010与2007的区别 配置基于表单的身份认证
  • 原文地址:https://www.cnblogs.com/cwyblogs/p/8257466.html
Copyright © 2011-2022 走看看