3第三章 模版.ppt
文本预览下载声明
C++面向对象程序设计教程 第3章 模板 习题解答 一、选择题 二、填空题 三、编程题 * 1.下列关于模板的叙述中,错误的是 。 A)模板声明中的第一个符号总是关键字template B)在模板声明中用“<”和“>”括起来的部分是模板的类型形参表 C)类模板不能有数据成员 D)在一定条件下函数模板的类型实参可以省略 解析:由模板声明的格式可知选项A、B正确。在调用模板函数时,如果编译系统从模板函数的类型实参表中得到的信息已经能够判断部分或全部虚拟类型参数所对应的实际类型,而且它们又正好是模板形参中最后的若干个参数,则在模板类型实参表中可以省略这几个参数,选项D正确。类模板中可以有数据成员,数据成员的类型可以是虚拟类型,也可以是具体类型,选项C错误。 答案:C 2.有以下函数模板定义: template class ElemType ElemType Fun(const ElemType x, const ElemType y) { return x * x + y * y; } 在下列对Fun()的调用中,错误的是 。 A)Fun(3, 5); B)Fun(3.0, 5.5); C)Fun(3, 5.5); D)Funint(3, 5.5); 解析:当从模板函数类型实参表获得的信息有矛盾时,模板类型实参不能省略。例如选项C中,编译系统从第一个参数3获得的信息是ElemType对应于int,而从第二个参数5.5处获得的信息是ElemType对应于double,两者相互矛盾,因此,编译时将产生错误。解决的方法之一是显式给出虚拟类型参数ElemType对应的模板类型实参,强制ElemType对应于int。 答案:C 3.关于关键字class和typename,下列表述中正确的是 。 A)程序中typename都可以替换为class B)程序中的class都可以替换为typename C)在模板类型形参表中只能用typename来声明参数的类型 D)在模板类型形参表中只能用class或typename来声明参数的类型 解析:程序中的typename都可以替换为class,但程序中的class不可以全部替换为typename。例如:在“模板类型形参表”中,关键字typename和class是可以互换的;但是在“类模板名”前的关键字class代表的含义是类,不可以用typename代替,选项B错误。在模板类型形参表中除了typename和class以外也可以用常规类型来声明参数的类型,选项C、D错误。 答案:A 4.有以下函数模板: template class ElemType ElemType Square(const ElemType x) { return x * x; } 其中ElemType是 。 A)函数形参 B)函数实参 C)模板类型形参 D)模板类型实参 解析:由函数模板的定义可知ElemType为模板类型形参。 答案:C 5.C++中的模板包括 。 A)对象模板和函数模板 B)对象模板和类模板 C)函数模板和类模板 D)变量模板和对象模板 解析:C++语言通过模板提供了一种将类型参数化的机制,其中包括函数模板和类模板。 答案:C 1.已知一个函数模板的声明如下: template typename T1, typename T2 T1 Fun(T2 n) { return n * 5.0; } 若要求以int型数7为函数实参调用该模板函数,并返回一个double型数,则该调用应表示为 。 解析:当虚拟类型类型参数作为函数的返回值类型,而函数的返回值类型与函数参数的类型可以不同时,不管函数类型实参的类型是什么,均不能省略模板类型实参,此题的模板类型实参应为double, int。 答案:Fundouble, int(7) 2.已知int dbl(int n ) { return n + n; }和long dbl(long n) { return n + n; }是一个函数模板的两个实例,则该函数模板的声明是 template typename ElemType 解析:将类型int和long参数化,用模板类型参数ElemType代替,可得该函数模板。 答案:ElemType Dbl(ElemType n ) { return n + n; } 3.下面程序的运行结果是 。 template class ElemType ElemType Min(const E
显示全部