计算机等级考试二级C++各章内容摘要:第9章
第九章模板
[考点1]函数模板
1。函数模板的概念、定义和应用。函数模板是一系列相关函数的模型或模板,其源代码形式相同,但数据类型不同。对于函数模板,数据类型本身成为它的参数,所以它是一个参数化的函数。声明函数模板的格式为:模板模板参数表声明函数声明
,其中模板参数表声明由一个或多个模板参数组成(如果有多个,需要用逗号分隔)。每个模板参数有以下形式:(1) Typename参数名(2) Class参数名(3)类型修饰符参数名
这里的参数名可以是任何标识符。在这三种形式中,前两种是等价的:声明模板参数时,关键字typename和class可以互换。用typename或class声明的参数称为虚类型参数;而用类型修饰声明的参数被选为正则参数,在形式上与普通函数参数声明相同。格式中的函数声明类似于一般函数的声明,只是有些类型修饰符被虚类型参数所取代。
2.省略模板参数。调用模板函数时,编译系统需要足够的信息来确定每个虚类型参数对应的实际类型。这种信息可以从两个不同的渠道获得:从模板参数表(用and括起来的参数表)或从模板函数参数表(用and括起来的参数表),模板参数的信息优先于函数参数的信息。如果从后者获得的信息已经可以确定对应于一些或所有虚拟类型参数的实际参数,并且它们只是参数表中的最后一个参数,则可以省略模板参数表中的那些参数。如果省略模板参数表中的所有参数,甚至可以省略空表。因此,如果x和y都是无符号的,那么addto unsigned (x,y,9),addt (x,y,9)和addTo(x,y,9)是等价的。相反,对于一个模板实参,如果不能从模板函数的实参表中获得相同的信息,则不能省略。或者虽然可以得到同样的信息,但是它后面还有其他不能省略的自变量,所以不能省略。下面是一些不能省略模板参数的情况的例子。(1)从模板函数参数表中获得的信息是矛盾的。(2)你需要得到一个特定类型的返回值,而不管参数的类型。(3)模板函数的参数表中没有出现虚类型参数。(4)函数模板包含正则参数。
3.功能模板的定制。不同数据类型处理表单的统一是建立模板的基础。但这种统一是相对的,个别数据类型可能比较特殊,在处理形式上与大部分数据类型不一致。对于这样的特例,可以通过重载模板函数来定制。这个重载的模板称为补充模板,相应的,原模板称为主模板。
【考点二】班级模板
1。类模板的概念、定义和应用。类模板是一系列相关类的模型或模板。这些类的成员组成相同,成员函数的源代码形式也相同。唯一的区别是目标类型(成员类型和参数类型以及成员函数的返回值)。对于一个类模板,数据类型本身成为它的参数,所以它是一种参数化的类,也是类的生成器。在模板中声明的类称为模板类。声明类模板的格式是:模板模板参数声明类声明模板参数声明由一个或多个模板参数组成;与一般的类声明不同,这里的类声明要用模板参数表声明中声明的虚类型参数来修饰它的一些成员,这样模板类就独立于任何具体的数据类型。模板外成员函数的声明格式为:模板模板参数表声明返回类型类名模板参数表::函数名(函数参数表)函数体,其中模板参数表是模板参数表声明中声明的参数名序列。需要注意的是,类模板的成员函数都是模板函数,所以在模板外声明成员函数的格式和声明普通模板函数的格式非常相似。类模板定义的对象格式为:类名模板参数表对象名;或者类名模板参数表对象名(构造函数参数表);在定义对象的过程中,编译系统会根据需要自动生成相应的类定义。这个根据类模板生成类定义的过程叫做类模板的实例化。由类模板实例生成的每个类定义都是相应类模板的一个实例。用类模板定义对象时,没有像函数参数表那样的附加信息通道,所以模板参数不能作为函数模板省略。但是,您可以为类模板的参数设置默认值。具体来说,在定义类模板时,可以为模板参数表声明的最后一个参数设置默认值;在这些具有默认值的参数中,最后一个对应的参数可以在定义对象时省略。
2.类模板的派生和继承。说到继承,总会涉及到两个类:基类和派生类,这两个类可能是模板类,也可能是模板类的实例。下面是一些常见的情况。(1)公共类继承类模板的实例。您可以通过继承类模板的实例来声明类。(2)模板类继承普通类。声明类模板时,应尽可能剥离与虚类型参数无关的类模板成员,形成一个公共类作为类模板的基类。所以类模板继承普通类是很常见的。(3)模板类继承模板类。您可以通过继承模板类来声明类模板。(4)模板类继承模板参数给定的基类。模板的派生甚至可以继承一个未知的基类。也就是说,要继承哪个基类是由模板参数决定的。
3.类模板的定制类似于函数模板,有时候需要定制类模板来适应一些特殊的情况。类的定制也是通过定义补充模板来实现的,这叫做模板的专门化。每个补充模板都是主模板的特例。
0条评论