• 7.1 C++模板基本概念及语法 《C++模板与标准模板库》


    参考:http://www.weixueyuan.net/view/6398.html

    总结:

      模板是另一种代码重用机制。

      需要设计的几个类,其功能都是一样的,仅仅只是需要操作的数据类型不同。 有更好的方法:设计一个模板类。

      定义模板类array时,前面加上了一句声明:    template< class T > 该语句称为模板头,可以单独放在一行,也可以与后面的class array同放在一行,这都没有关系。模板头中的“T”我们称之为类参数,类参数表示将会以确定的数据类型替代之,任何有效的C++标识符均可以作为类参数,当然通常我们还是会用“T”来做类参数

      对于模板类而言,在类外定义类中的成员函数的时候都需要加上模板头。同时由于array是个模板类,因此类名是array< T >,故而在类外定义带参构造函数的完整形式是:  

      模板类至少有一个类参数,但是可以有多个类参数,每一个类参数前都必须有关键字class或者类型名。

    C++提供了多种代码重用机制,在前面介绍派生和继承时,派生类可以继承基类中的成员变量和成员函数。模板是另一种代码重用机制。 

    有时候在设计程序的时候会遇到这样一种情况:需要设计的几个类,其功能都是一样的,仅仅只是需要操作的数据类型不同。遇到这样的情况,固然可以将所有的类都设计一遍,但是在C++中,我们有更好的方法:设计一个模板类。假设我们需要创建一个数组类,该数组可能是整型数组,也可能是double类型数组、string类型数组等,为此我们需要设计一个数组的模板类。

    例1:

    template< class T >
    class array
    {
    public:
        array( int );
        T & operator[]( int );
        const T & operator[] ( int )const;
        int getlen()const{ return length; }
        ~array();
    private:
        array(){};
        int length;
        T * num;
    };
    
    template < class T >
    array< T >::array( int n )
    {
        num = new T[n];
        length = n;
    }
    
    template < class T >
    array< T >::~array()
    {
        delete[] num;
    }
    
    template< class T >
    T & array< T > ::operator[] (int i)
    {
        if( i < 0 || i >= length)
            throw string("out of bounds");
        return num[i];
    }
    
    template< class T >
    const T & array< T > ::operator[] (int i) const
    {
        if( i < 0 || i >= length)
            throw string("out of bounds");
        return num[i];
    }
    
    template< class T >
    ostream & operator<<(ostream & out, const array <T> & A)
    {
        for(int i=0; i < A.getlen(); i++)
            out<< A[i] << " ";
        return out;
    }

    在本例中,我们定义了一个数组的模板类array,借用该示例,我们来了解一下模板类的一些基本语法。在本例中我们定义模板类array时,前面加上了一句声明:
        template< class T >
    该语句称为模板头可以单独放在一行,也可以与后面的class array同放在一行,这都没有关系。模板头中的“T”我们称之为类参数,类参数表示将会以确定的数据类型替代之,任何有效的C++标识符均可以作为类参数,当然通常我们还是会用“T”来做类参数。

    模板头中template关键字和“<”之间可以保留一个空格,但通常这两者之间不留空格。

    对于模板类而言,在类外定义类中的成员函数的时候都需要加上模板头。同时由于array是个模板类,因此类名是array< T >,故而在类外定义带参构造函数的完整形式是:

    template < class T >
    T & array< T >::array( int n )
    {
        num = new T[n];
        length = n;
    }

    而如果是在类内部定义该函数,则会相对简单一些:

    array( int n )
    {
        num = new T[n];
        length = n;
    }

    在本例中用到了前面所介绍的很多知识点,例如将默认构造函数置为private属性,重载下标操作符,重载输出操作符等,这些知识点希望能够仔细领会。

    模板类至少有一个类参数,但是可以有多个类参数,每一个类参数前都必须有关键字class或者类型名。

    例2:

    template< class T, class S, class R>
    class test
    {
    public:
        S fun( R r);
    private:
        T x;
    };

    本例就是一个具有多个类参数的模板类示例。

  • 相关阅读:
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
    jQuery火箭图标返回顶部代码
  • 原文地址:https://www.cnblogs.com/yongpan/p/7920552.html
Copyright © 2020-2023  润新知