zoukankan      html  css  js  c++  java
  • C++ 类模板与模板类详解

      在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢?

      事实上class用于定义类,在模板引入c++后,最初定义模板的方法为:template<class T>,这里class关键字表明T是一个类型,后来为了避免class在这两个地方的使用可能给人带来混淆,所以引入了typename这个关键字,它的作用同class一样表明后面的符号为一个类型,这样在定义模板的时候可以使用下面的方式了:

      template<typename T>.在模板定义语法中关键字class与typename的作用完全一样

    区分类模板与模板类的概念

      一个类模板(类生成类)允许用户为类定义个一种模式,使得类中的某些数据成员、默认成员函数的参数,某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

      如果一个类中的数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表一类类。

      类模板定义:

    定义一个类模板,一般有两方面的内容:

    A。首先要定义一个类,其格式为:

    template<class T>

    class test

    {

    ....

    }

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

    例如:

     1 template<class T>
     2 
     3 class Test
     4 {
     5 private:
     6     T n;
     7     const T i;
     8 public:
     9     Test():i(0) {}
    10     Test(T k);
    11     ~Test(){}
    12 
    13     void print();
    14     T operator+(T x);
    15 };

    如果在类外定义成员函数,若此成员函数中有模板参数存在,则除了需要和一般类的类外定义成员函数一样的定义外,还需要在函数外进行模板声明
    例如:

    1 template<class T>
    2 void Test<T>::print()
    3 {
    4     std::cout<<"n="<<n<<std::endl;
    5     std::cout<<"i="<<i<<std::endl;
    6 }
    1 template<class T>
    2 Test<T>::Test(T k):i(k){ n=k;}
    3 
    4 template<class T>
    5 T Test<T>::operator+(T x){
    6     return n + x;
    7 }

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

    模板类是类模板实例化后的一个产物,说个具体点的例子吧,我们把类模板比作是一个做饼干的模子,而模板类就是用这个模子做出来的饼干,至于这个饼干是什么味道的就要看你自己在实例化时用的是什么材料了,你可以做巧克力饼干,也可以做牛奶饼干,这些饼干出了材料不一样外,其它的东西都是一样的了。

  • 相关阅读:
    这是一个数学题牛客训练赛E
    最好使用%f输出浮点数据,acm
    hdu 1263 水果 结构的排序+sort自定义排序
    多校寒训TaoTao要吃鸡dp
    计算直角坐标系的面积并和面积交和周长并(可小数)
    Codeforces Round #620 (Div. 2)E LCA
    Codeforces Round #620 (Div. 2)D dilworld定理
    Codeforces Round #621 (Div. 1 + Div. 2)D dij(思维)
    poj2243 给出m个模式串,求长度小于n的且存在模式串的字符串数有多少个(a~z)(思维构造+ac自动机)
    poj2778 求构造长度为n的字符串不包含给定的m个字符串的个数(矩阵乘法+ac自动机)
  • 原文地址:https://www.cnblogs.com/cxq0017/p/6076856.html
Copyright © 2011-2022 走看看