1、国家二级 C+机试(模板)模拟试卷 5及答案与解析 一、选择题 1 下列关于模板的叙述中,错误的是 ( )。 ( A)模板声明中的第一个符号总是关键字 temp1ate ( B)在模板声明中用和括起来的部分是模板的形参表 ( C)类模板不能有数据成员 ( D)在一定条件下函数模板的实参可以省略 2 有如下函数模板定义: temp1ate c1ass T T func(T x,T y)return x*x+y*y; 在下列对 func的调用中,错误的是 ( )。 ( A) func(3,5); ( B) func(3 0,5 5); ( C) func(3,5 5); ( D) func int
2、 (3,5 5); 3 有如下函数模板: temp1ate typename Ttypename U T cast(Uu) return u; 其功能是将 U类型数据转换为 T类型数据。已知 i为 int型变量,下列对模板函数 cast的调用中正确的是 ( )。 ( A) cast(i), ( B) cast (i); ( C) cast char*,int (i); ( D) cast double,int (i); 4 关于在调用模板函数时模板实参的使用,下列表述正确的是 ( )。 ( A)对于虚拟类型参数所对应的模板实参,如果能从模板函数的实参中获得相同的信息,则都可以省略 ( B)对于
3、虚拟类型参数所对应的模板实参,如果它们是参数表中的最后的若干个参数,则都可以省略 ( C)对于虚拟类型参数所对应的模板实参,若能够省略则必须省略 ( D)对于常规参数所对应的模板实参,任何情况下都不能省略 5 有如下函数模板: temp1ate c1ass T T square(T x)return x*x;) 其中 T是 ( )。 ( A)函数形参 ( B)函数实参 ( C)模板形参 ( D)模板实参 6 下列函数模版中的定义中,合法的是 ( )。 ( A) temp1ate typename T T abs(T x)return x 0? x:x;) ( B) temp1ate c1ass
4、 T T abs(T x)return x 0? x:x; ( C) temp1ate T c1ass T abs(T x)return x 0? x:x; ( D) temp1ate T abs(T x)retum x 0? x: x;) 7 C+中的模板包括 ( )。 ( A)对象模板和函数模板 ( B)对象模板和类模板 ( C)函数模板和类模板 ( D)变量模板和对象模板 8 下列有关模板的叙述中,正确的是 ( )。 ( A)函数模板不能含有常规形参 ( B)函数模板的一个实例就是 个函数定义 ( C)类模板的成员函数不能是模板函数 ( D)用类模板定义对象时,绝对不能省略模板实参 9
5、下面是一个模板声明的开 始部分: temp1ute typename T double_ 由此可知 ( )。 ( A)这可能是一个函数模板的声明 ( B)这可能是一个类模板的声明 ( C)这既可能是一个函数模板的声明,也可能是一个类模板的声明 ( D)这肯定是一个错误的模板声明 10 下列关于模板的叙述中,错误的是 ( )。 ( A)调用模版函数时,在一定条件下可以省略模板实参 ( B)可以用 int、 double这样的类型修饰符来声明模版参数 ( C)模板声明中的关键字 c1ass都可以用关键字 typename替代 ( D)模板的形参表中可以有多个参数 11 下列关于函数模板的描述中,错
6、误的是 ( )。 ( A)从模板实参表和从模板函数实参表获得信息矛盾时,以模板实参的信息为准 ( B)对于常规参数所对应的模板实参,任何情况下都不能省略 ( C)虚拟类型参数没有出现在模板函数的形参表中时,不能省略模板实参 ( D)模板参数表不能为空 12 下列关于模板形参的描述中,错误的是 ( )。 ( A)模板形参表必须在关键字 temp1ate之后 ( B)模板形参表必须用括弧 ()括起来 ( C)可以 用 c1ass修饰模板形参 ( D)可以用 typename修饰模板形参 13 下列关于类模板的描述中,错误的是 ( )。 ( A)类模板的成员函数都是模板函数 ( B)可以为类模板参数
7、设置默认值 ( C)类模板描述了一组类 ( D)类模板中只允许有一个类型参数 14 下列关于模板的叙述中,正确的是 ( )。 ( A)如果一个类中存在纯虚函数,这个类就是类模板 ( B)函数模板不能有形式参数表 ( C)类模板是一种参数化类型的类,是类的生成器 ( D)类模板中不能包含构造函数 15 有函数模 板声明和一些变量定义如下: temp1ate c1ass T1, c1ass T2, c1ass T3 T1 sum(T2,T3); double d1, d2; 则下列调用中,错误的是 ( )。 ( A) sum double, double, double (d1, d2); ( B
8、) sum double, double (d1, d2); ( C) sum double (d1,d2); ( D) sum(d1, d2); 16 下列关于函数模板的描述中,正确的是 ( )。 ( A)函数模板是一个实例函数 ( B)使用函数模板定义的函数没有返回类型 ( C)函数模板的类型参数与函数的参数相同 ( D)通过使用不同的类型参数,可以从函数模板得到不同的实例函数 17 有如下函数模板定义: temp1ate typename T1,Typename T2 T1 Fun(T2 n)return n*5 0; 若要求以 int型数据 9作为函数实参调用该模板,并返回一个 dou
9、ble型数据,则该调用应表示为 ( )。 ( A) FUN(9) ( B) FUN 9 ( C) FUN double 9 ( D) FUN 9 (double) 18 下列关于模板的描述中,错误的是 ( )。 ( A)类模板的成员函数都是模板函数 ( B)函数模板是一种参数化类型的函数 ( C)满足一定条件时可以省略模板实参 ( D)模板形参只能由关键字 typename声明 19 已知主函数中通过如下语句序列实现对函数模板 swap的调用: int a10, b10; swap(a, b, 10); 下列对函数模板 swap的声明中,会导致上述语句序 列发生编译错误的是 ( )。 ( A)
10、 temp1ate typename T void swap(T a,T b, int size); ( B) temp1ate typename T void swap (int size,T a,T b); ( C) temp1ate typename T1, typenameT2 void swap(T1 a, T2 b, int size; ( D) temp1ate c1ass T1, c1ass T2 void swap (T1 a, T2 b, int size); 20 在定义函数模板或类模板时,开头的保留字是 ( )。 ( A) typename ( B) temp1ate
11、( C) c1ass ( D) typedef 21 若有函数模板 mySwap和一些变量定义如下: temp1ate c1ass T void mySwap(T x,T y); double dl,d2; int il,i2; 下列对 mySwap的调用中,错误的是 ( )。 ( A) mySwap(il,i2) ( B) mySwap(dl,d2) ( C) mySwap(il,dl) ( D) mySwap int (12,d2) 22 模板对类型的参数化提供了很好的支持,因此 ( )。 ( A)类模板的主要作用是生成抽象类 ( B)类模板实例化时,编译器将根据给出的模板实参生成一个类
12、( C)在类模板中的数据成员都具有同样类型 ( D)类模板中的成员函数都没有返回值 23 关于关键字 c1ass和 typename,下列表述中正确的是 ( )。 ( A)程序中的 typename都可以替换为 c1ass ( B)程序中的 c1ass都可以替换为 typename ( C)在模板形参表中只能用 ty)ename来声明参数的类型 ( D)在模板形参表中只能用 c1ass或 typename来声明参数的类型 24 下列关于类模板的模板参数的叙述中,错误的是 ( )。 ( A)模板参数可以作为数据成员的类型 ( B)模板参数可以作为成员函数的返回类型 ( C)模板参数可以作为成员函
13、数的参数类型 ( D)模板参数不能作为成员函数的局部变量的类型 25 下列模板声明中,有语法错误的是 ( )。 ( A) temp1ate typename T T fun(T x)return x;) ( B) temp1ate typename T T fun(T x,int n)return x*n,) ( C) temp1ate c1ass T T fun(T *p)return *p;) ( D) temp1ate c1ass T T c1assAT n; 26 在定义一个类模板时,模板形参表是用一对括号括起来的,所采用的括号是( )。 ( A) ( ) ( B) ( C) ( D)
14、 27 有如下模板声明: temp1ate typename T1, typename T2 c1ass A; 下列声明中,与上述声明不等价的是 ( )。 ( A) temp1ate c1ass T1, c1ass T2 c1ass A; ( B) temp1ate c1ass T1, typename T2 c1ass A; ( C) temp1ate typename T1, c1ass T2 c1ass A; ( D) temp1ate typename T1, T2 c1ass A; 28 若 MyTemp是一个只有一个虚拟类型参数的类模板,且有如下语句序列 MyTemp double
15、 p2; MyTemp long p3 2; 编译系统在处理上面的语句序列时,所生成的模板 MyTemp的实例的个数是( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 0 29 下列关于模板的叙述中,错误的是 ( )。 ( A)调用模板函数时,有时可以省略模板实参 ( B)函数模板的每个实例就是一个函数定义 ( C)类模板的每个实例就是一个类定义 ( D)类模板的实例是一个类对象 30 下列类模板的定义中语法格式错误的是 ( )。 ( A) temp1ate c1ass T c1ass Buffer * ; ( B) temp1ate typename T c1ass Buffer
16、 */ ( C) temp1ate c1ass T1,c1ass T2 c1ass Buffer * ; ( D) temp1ate T c1ass Bufrer * ; 国家二级 C+机试(模板)模拟试卷 5答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 此题考查模板的概念。模板的一般说明形式如下: temp1ate类型形参表函数返回值类型函数名 (形参表 )函数体 ,所以选项 A、 B正确。函数模板的实参在一定条件下是可以省略的,所以选项 C错误。 【知识模块】 模板 2 【正确答案】 C 【试题解析】 此题考查的是函数模板的使用。引用模板函数和引用一般函数在语法形式上基本相同
17、。需要注意的是说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中的对应形参。本题 C选 项中,编译系统从第一个参数 “3”获得信息 “int”和从第二个参数获得信息 “double”两者矛盾,错误; A、 B选项正确; D选项中,函数名后的 int是模板实参表,编译系统会将 double型的形参 “5 5”自动转化成 int类型。 【知识模块】 模板 3 【正确答案】 D 【试题解析】 此题考查的是模板函数的调用。本题中 cast()函数的实参 i只能确定模板参数 U的类型为 int,而不能确定另外一个模板参数 T,故选项 A、 B错误; C+
18、语言不允许隐式地将 int转化为 char*,故选项 C错误。 【知识模块】 模板 4 【正确答案】 D 【试题解析】 此题考查的是模板实参的省略。模板实参在以下集中情况中不能省略:从模板函数实参表获得的信息有矛盾;需要获得特定类型的返回值,而不管参数的类型如何;虚拟类型参数没有出现在模板函数的形参表中;函数模板含有常规形参。 【知识模块】 模板 5 【正确答案】 C 【试题解析】 此题考查的是函数模板。声明一个函数模板的格式是: temp1ate模板形参表声明函数声明, 函数体 其中的模板形参表声明是由一个或多个“模板形参 ”组成的,每个 “模板形参 ”可具有以下几种形式: typename
19、参数名;class参数名;类型修饰参数名。 【知识模块】 模板 6 【正确答案】 A 【试题解析】 此题考查的是函数模板。声明一个函数模板的格式是: temp1ate模板形参表声明函数声明,其中的模板形参表声明是由一个或多个 “模板形参 ”组成的,每个 “模板形参 ”可具有以下几种形式: t)rpename参数名; class参数名;类型修饰参数名。 【知识模块】 模板 7 【正确答案】 C 【试题解析】 此题考查的是模板。在 C+语 言中,模板有两类:函数模板和类模板。 【知识模块】 模板 8 【正确答案】 B 【试题解析】 此题考查的是模板的概念。函数模板可以含有常规形参;函数模板的一个实
20、例就是一个函数定义;类模板中的成员函数都是模板函数;在用类模板定义对象时,由于没有像函数实参表这样的额外信息渠道,因此无法按函数模板的方式省略模板形参,但是可以为类模板的参数设置默认值。 【知识模块】 模板 9 【正确答案】 A 【试题解析】 此题考查的是函数模板的声明。声明一个函数模板的格式是:temp1ate模板 形参表声明函数声明;定义类模板的格式是: temp1ate类型形参表 class类模板名 ;。 【知识模块】 模板 10 【正确答案】 C 【试题解析】 在声明模板参数是,关键字 typename和 class是可以互换的,两者是等价的。但选项 C中说的是模版声明,在类模板声明中
21、,替换可能会引起麻烦。 【知识模块】 模板 11 【正确答案】 D 【试题解析】 在调用一个模板函数时,如果编译系统能够从模板实参表判断其中或全部虚拟类型参数对应的实际参数,而且它们正好是参数表中 最后的若十参数,则模板实参表中的那几个参数可以省略。 【知识模块】 模板 12 【正确答案】 B 【试题解析】 声明一个函数模板的格式是: temp1ate模板形参表声明函数声明,其中的模板形参表声明是由一个或多个模板形参组成 (如果是多个,需要用逗号隔开 )。 每个模板形参具有下面的几种形式: typename参数表 class参数名 类型修饰参数名 由此可知,模板形参表必须用括弧 括起来,而不是
22、 (),所以选项 B)为正确答案。 【知识模块】 模板 13 【正确答案】 D 【试题解析】 类模板就是一系列相关类的模型或样板,这些类的成员组成相同,成员函数的源代码形式相同,所不同的只是所针对的类型 (成员的类型以及成员函数的参数和返回值的类型 )。一个类模板的格式是: temp1ate模板形参表声明类声明,模板形参表声明是由一个或多个模板形参组成。在定义类模板时,可以为模板形参表声明的最后若干个参数设置默认值。 【知识模块】 模板 14 【正确答案】 C 【试题解析】 对于函数模板,数据类型本身成了它的参数,是一种 参数化类型的函数。对于类模板,数据类型本身成了它的参数,因而是一种参数化
23、类型的类,是类的生成器。 【知识模块】 模板 15 【正确答案】 D 【试题解析】 虚拟类型参数 T1没有出现在模板函数的形参表中,因此在调用时不可能从模板函数的实参表中获得相应的信息,因此 T1无法省略。而在选项 D)中省略了。 【知识模块】 模板 16 【正确答案】 D 【试题解析】 函数模板是一系列相关函数的模型或样板,这些函数的源代码相同,只是所针对的数据类型不同。数据类型成了函数模板的参数,所以函数模 板是一种参数化类型的函数。 【知识模块】 模板 17 【正确答案】 C 【试题解析】 根据函数模板的定义,在选项 C的调用中,把 double类型传递给T1, int型传递给 T2。
24、【知识模块】 模板 18 【正确答案】 D 【试题解析】 同一模板的声明和定义中,模板形参的名字不必相同。每个模板类型形参前面必须带上关键字 typename/class,每个非类型形参前面必须带上类型名字。 【知识模块】 模板 19 【正确答案】 B 【试题解析】 由题目中函数 swap(a,b, 10)调用语句可知,在对函数模板 swap的声明语句中,应将第一、二个参数设为数组变量,第三个参数为整型变量。 【知识模块】 模板 20 【正确答案】 B 【试题解析】 定义函数模板或类模板时,开头的保留字是 temp1ate。 【知识模块】 模板 21 【正确答案】 C 【试题解析】 按照函数模
25、板 mySwap的定义,变量 x和 y应该是同一类型,而在选项 C)的定义中变量 il和 dl属于不同的数据类型。 【知识模块】 模板 22 【正确答案】 B 【试题解析】 此题考查了类模板的概念。在定义对象的过程中,系统会自动地根据需要生成相应的类定义,这种依据类模板生成具体类的过程称为类模板的实例化。 【知识模块】 模板 23 【正确答案】 A 【试题解析】 此题考查的是 class和 typeniune两个关键字。关键字 class除了能用来定义类以外还能用来声明模板的虚拟类型参数。在用作声明虚拟类型参数时typename与 class可以互换,但不能使用 typename来定义类:在模
26、板形参表中除了可以用 t)rpename和 class声明虚拟类型参数外,还可以使用 普通类型声明常规函数,故选项 C错误。 【知识模块】 模板 24 【正确答案】 D 【试题解析】 此题考查的是模板参数。模板参数是一种参数化的数据模型,在模板类或模板函数中,只要使用数据类型的地方都能使用模板参数来代表一种未知的数据类型。所以,模板参数可以作为成员函数的局部变量类型。 【知识模块】 模板 25 【正确答案】 D 【试题解析】 第四个选项是定义类模板的,但是 class前面的 T是多余的。对于第二个选项,同一个类的对象相乘还是同一个类的对象,但是可能要考虑溢出的问题。 【知识模块】 模板 26
27、【正确答案】 C 【试题解析】 声明一个类模板的格式是: temp1ate模板形参声明类声明。 【知识模块】 模板 27 【正确答案】 D 【试题解析】 在类模板中,数据类型本身成了它的参数,因而是一种参数化类型的类,是类的生成器。声明一个类模板的格式是: temp1ate模板形参表声明 类声明,模板形参表声明是由一个或多个模板形参组成。对于本题来说,模板形参表中包括类型 T1和 T2两个类型参数,而在选项 D)中 T1说明其类型,而 T2没有说明其类型,与题干中的模板说明不一致。 【知识模块】 模板 28 【正确答案】 C 【试题解析】 p2是一个 double型的 MyTemp, p32是
28、一个 long型 MyTemp数组,其中包括两个元素。所以共有 3个 MyTemp的实例。 【知识模块】 模板 29 【正确答案】 D 【试题解析】 在定义对象的过程中,编译系统会自动地根据需要生咸相应的类定义,这种依据类模板生成类定义的过程称为类模板的实例化。类模板实例化所生成的每一个类定义就是相应类模板的一个实例。 【知 识模块】 模板 30 【正确答案】 D 【试题解析】 定义类模板的一般形式是: temp1ate类型名参数名 1,类型名参数名 2, class类名 类声明体 ; 模板的类型参数由关键字 class或关键字 t, pename及其后的标识符构成。在模板参数表中关键字 class和 typename的意义相同。 【知识模块】 模板