类模板

类模板

用于形成实体类的程序代码
类模板,是对一批仅仅成员数据类型不同的类的抽象,程序员只要为这一批类所组成的整个类家族创建一个类模板,给出一套程序代码,就可以用来生成多种具体的类,(这类可以看作是类模板的实例),从而大大提高编程的效率。类模板,模板的类型参数由关键字class或关键字typename及其后的标识符构成。类模板是一个类家族的抽象,它只是对类的描述,编译程序不为类模板(包括成员函数定义)创建程序代码,但是通过对类模板的实例化可以生成一个具体的类以及该具体类的对象。
    中文名:类模板 外文名: 别名: 关键字:class 来源:计算机编程 类型参数:关键字class

简介

定义

类模板,模板的类型参数由关键字class或关键字typename及其后的标识符构成。在模板参数表中关键字class 和typename 的意义相同。(在标准C++之前关键字typename没有被支持,把这个关键字加入到C++中的原因是因为有时必须要靠它来指导编译器解释模板定义。)

例子

定义类模板的一般形式是:

template<类型名参数名1,类型名参数名2,…>

class类名

{

类声明体

};

例如,template

class Smemory

{…

public:

void input(T x);

}

表示定义一个名为Smemory的类模板,其中带类型参数T。

在类模板的外部定义类成员函数的一般形式是:

template<类型名参数名1,类型名参数名2,…>

函数返回值类型类名<参数1参数名,…>::成员函数名(形参表)

{

函数体

}

例如:template

void Smemory::mput(T x)

{…}

表示定义一个类模板Smemory的成员函数,函数名为mput,形参x的类型是T,函数无返回值。

类模板是一个类家族的抽象,它只是对类的描述,编译程序不为类模板(包括成员函数定义)创建程序代码,但是通过对类模板的实例化可以生成一个具体的类以及该具体类的对象。

与函数模板不同的是:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定,

其实例化的一般形式是:

类名<数据类1(或数据),数据类型2(或数据)…>对象名

例如,Smemory mol;

表示将类模板Smemory的类型参数T全部替换成int型,从而创建一个具体的类,并生成该具体类的一个对象mol。

类模板示例:

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

A.首先要定义类,其格式为:

template//或用template

class foo

{

……

}

foo为类名,在类定义体中,通用类型T可以作为普通成员变量的类型,还可以作为const和static成员变量以及成员函数的参数和返回类型之用。例如:

template

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);

};

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

例如

template

Test::Test(T k):i(k){n=k;cnt++;}

如果函数是以通用类型为返回类型,则要在函数名前的类名后缀上“”(注:所有函数都要加“”)。例如:

template

T Test::operator+(T x){

return n +x;

}

C.在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明,例如

template

int Test::cnt=0;

template

Test::Test(T k):i(k){n=k;cnt++;}

类模板的使用

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

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

类模板的派生

可以从类模板派生出新的类,既可以派生类模板,也可以派生非模板类。派生方法:

⑴从类模板派生类模板可以从类模板派生出新的类模板,它的派生格式如下例所示:

template

class base

{

……

};

template

class derive:public base

{

……

};

与一般的类派生定义相似,只是在指出它的基类时要缀上模板参数,即base。

⑵从类模板派生非模板类可以从类模板派生出非模板类,在派生中,作为非模板类的基类,必须是类模板实例化后的模板类,并且在定义派生类前不需要模板声明语句:template。例如:

template

class base

{

……

};

class derive:public base

{

……

};

在定义derive类时,base已实例化成了int型的模板类。

类模板的作用

模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。rn模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的概念。再理解深刻点就是,在c++里,常说的多态一般分为两种:

一种是运行时的多态,也就是虚函数体现的多态,另一种是编译时的多态,也就是泛型编程的多态,体现在参数的多态,

在作用上是为了提高编程效率,其实用其他技术也能达到同样的效果。

相关词条

相关搜索

其它词条