类模板与模板类 &&函数模板与模板函数

来源:互联网 发布:淘宝 寄海外 编辑:程序博客网 时间:2024/04/29 10:42
  1. (一)C++类模板与模板类:


    (1)类模板的定义:
    1)关键在于模板,所谓模板,就是可以产生多个实例,所以类模板为多个类。
    2)类中的数据成员类型,或成员函数的参数类型,返回值类型不定。


    (2)类模板的范例:
    template <class T>
    class Test{
    private:
        T n;
        const T i;
        static T cnt;
    public:
        Test():i(0){}
        Test(T k);
        ~Test(){}
        void print();
        T operator+(T x);
    };


    使用这个Vector模板就可以产生很多的class(类),Vector <int> 、Vector <char> 、Vector <   Vector <int>   > 、Vector <Shape*> ……。 


    (3)类模板的通用数据成员,通用成员函数类外声明:
    B.       在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则除了需要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明
    例如
    template<class T>
    void Test<T>::print(){
        std::cout<<"n="<<n<<std::endl;
        std::cout<<"i="<<i<<std::endl;
        std::cout<<"cnt="<<cnt<<std::endl;
     
    }
    如果函数是以通用类型为返回类型,则要在函数名前的类名后缀上“<T>”。例如:
    template<class T>
    Test<T>::Test(T k):i(k){n=k;cnt++;}
    template<class T>
    T Test<T>::operator+(T x){
                   return n + x;
                   }
    C.       在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明,例如
    template<class T>
    int Test<T>::cnt=0;
    template<class T>
    Test<T>::Test(T k):i(k){n=k;cnt++;}




    (4)模板类:
    关键在于类,是类模板中参数实例化后产生的一个类。
    如:Vector <int> 、Vector <char> 、……全是模板类。 


    ----------------------------------------------


    (二)C++的函数模板与模板函数:


    (1)函数模板:
    函数模板的重点是模板。表示的是一个模板,专门用来生产函数,可以产生多个函数。


    (2)函数模板的范例:
     template <class T>   
     //或写成: template <typename T>    函数参数的类型T
     T abs(T val)   
    {   
           return val<0 ? -val : val;   
     }  


    在运用的时候,可以显式(explicitly)生产模板函数,fun <int> 、fun <double> 、fun <Shape*> ……。 


    也可以在使用的过程中由编译器进行模板参数推导,帮你隐式(implicitly)生成。 


    fun(6);//隐式生成fun <int> 


    fun(8.9);//隐式生成fun <double> 


    fun(‘a’);//   隐式生成fun <char> 


    Shape*   ps   =   new   Cirlcle; 


    fun(ps);//隐式生成fun <Shape*> 




    (3)模板函数:
    模板函数的重点是函数。表示的是由一个模板生成而来的函数。
0 0