首页 > 代码库 > 初探C++类模版学习笔记

初探C++类模版学习笔记

类模板

 

实现:在定义类的时候给它一个或多个参数,这个些参数表示不同的数据类型。                              -->抽象的类。

在调用类模板时, 指定参数, 由编译系统根据参数提供的数据类型自动产生相应的模板类                   -->具体的类。

 

 

 

类模板的定义


C++的类模板的写法如下:

 

template <类型参数表>        //类型参数表的写法就是:class 类型参数1, class 类型参数2, …class 类模板名{    成员函数和成员变量};


 

类模板里的成员函数, 如在类模板外面定义时,

 

template <型参数表>返回值类型 类模板名<类型参数名列表>::成员函数名(参数表){     ……}


 

用类模板定义对象的写法如下:
类模板名 <真实类型参数表>  对象名(构造函数实际参数表);
如果类模板有无参构造函数, 那么也可以只写:
类模板名 <真实类型参数表>  对象名;

 

 

举例:

 

template <class T1, class T2>class Pair{public:    T1 key;  //关键字    T2 value;  //值    Pair(T1 k,T2 v):key(k),value(v) { };    bool operator < (const Pair<T1,T2> & p) const; };template<class T1,class T2>    //在类外定义 Pair的成员函数 operator <bool Pair<T1,T2>::operator<( const Pair<T1, T2> & p) const { return key < p.key; }  


Pair类模板的使用:

 

int main(){    Pair<string, int> student("Tom",19);     //实例化出一个类 Pair<string, int>    cout << student.key << " " << student.value;     return 0;}


 

 

函数模版作为类模板成员

 

 

#include <iostream>using namespace std;template <class T>class A{public:    template<class T2>     void Func(T2 t) { cout << t; } //成员函数模板};int main(){    A<int> a;    a.Func('K'); //成员函数模板 Func被实例化     return 0;}


 

类模板与非类型参数

 

 

template <class T, int size>class CArray{    T array[size];public:    void Print( )     {        for(int i = 0; i < size; ++i)        cout << array[i] << endl;     }       };


 

CArray<double, 40> a2;CArray<int, 50> a3;


注意:
CArray<int,40>和CArray<int,50>完全是两个类
这两个类的对象之间不能互相赋值

 

 

 

类模板与继承

 

 

普通类从模板类派生


 

template <class T>class A { T v1;  int n; };class B:public A<int> { double v;  };// 类A是个类模板,A<int>是模板类int main() {     B obj1;     return 0;}


 

类模板从模板类派生

 

template <class T1, class T2>class A { T1 v1; T2 v2;    };template <class T>class B:public  A<int, double> { T v; };int main() {     B<char> obj1; return 0; }


 

类模板A   ->实例化  模板类A<int,double>  ->派生   类模板B   ->实例化  模板类B<char>

此时B中有成员

        int v1;

        double  v2;

        T v;

 

 

 

 

类模板从普通类派生

 

 

class A {  int v1; };template <class T>class B:public A  { T v; };int main() {     B<char> obj1;     return 0; }

没什么可说的,在继承A的基础上增加了T类型的成员。

 

 

类模板从类模板派生

 

#include <iostream>using namespace std;template <class T1, class T2>class A{public:    T1 v1; T2 v2;};template <class T1, class T2>class B:public A<T1,T2>{public:    T1 v3; T2 v4;};int main(){    B<int,double> b;    B<int,double> *pb = &b;    b.v1 = 1;    b.v3 = 3;    b.v2 = 2.2;    b.v4 = 4.4;    cout << pb->v1<<endl;    cout << pb->v2<<endl;    cout << pb->v3<<endl;    cout << pb->v4<<endl;    return 0;}

要保证当给类模板B实例化的时候,类模板A也随之完成类型T的实例化。

B<int,double> b 时,B有自身的成员int v3 、double v4 也有继承A<int,double>的成员int v1 和 double v2