1、国家二级 C+机试(运算符重载、模板和 C+流)模拟试卷 6及答案与解析 一、选择题 1 若在表达式 y x中, 是作为成员函数重载的运算符,则该表达式还可以表示为 ( )。 ( A) x operator (y) ( B) operator (x, y) ( C) y operator (x) ( D) operator (y, x) 2 有类定义如下: class Type public: Type(int i=0); Type operator-(int); friend Type operator+(Type, Type); private: int val; ; 若有对象定义 Typ
2、e c1;则下列语句序列中,错误的是 ( )。 ( A) Type(3)+c1; ( B) e1+Type(3); ( C) 3-c1: ( D) c1-3; 3 若要对 Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )。 ( A) Data+(Data); ( B) Data operator+Data; ( C) Data+operatorData; ( D) operator+(Data, Data); 4 若要对类 BigNumber中重载的类型转换运算符 long进行声明,下列选项中正确的是 ( )。 ( A) operator long()const; ( B
3、) operator long(bigNumber); ( C) long operator long()const; ( D) long operator long(BjgNumber); 5 有如下类模板定义: template typename T class BigNumber long n: public: BigNumber(T i): n(i) BigNumber operator+(BigNumber b) return BigNtmaber(n+b n); 已知 b1、 b2是, BigNumber的两个对象,则下列表达式中错误的是 ( )。 ( A) b1+b2 ( B)
4、b1+3 ( C) 3+b1 ( D) 3+3 6 为类 Matrix重载下列 运算符时,只能作为 Matrix类成员函数重载的运算符是( )。 ( A) + ( B) = ( C) ( D) + 7 有如下类定义 class MyClass public: _ Private: int data; ; 若要为 MyClass类重载流输入运算符,使得程序中可以 “cin obj; ”形式输入 MyClass类的对象 obj,则横线处的声明语句应为 ( )。 ( A) friend istream。 【知识模块】 运算符重载 9 【正确答案】 D 【试题解析】 “*”是一个二元运算符,在作为成员
5、函数重载时参数表中只有一个参数,对应于第二个操作数,而第一个操作数就是对象本身,仅以 this指针的形式隐藏在参数表中。 【知识模块】 运算符重载 10 【正确答案】 A 【试题解析】 由表达式 c2=c1+10可知,在对 “+”进行重载时,第一操作数是MyClock类的对象,而第二操作数是一个整型数据。 【知识模块】 运算符重载 11 【正确答案】 B 【试题解析】 表达式 c1+c2*c1的含义是 c1加上 c2与 c1的积。 【知识模块】 运算符重载 12 【正确答案】 A 【试题解析】 此题考查的是运算符重载的概念。 c1+语言规定, =、 、 ()、 -以及所有的类型转换运算符只能作
6、为成员函数重载,如果要重载为友元函数就必须重载为非成员函数。 【知识模块】 运算符重载 13 【正确答案】 D 【试题解析】 =、 、 ()、 -以及所有的类型转换运算符只能作为成员函数重载,而且不能是针对枚举类型操作数的重载。 【知识模块】 运算符重载 14 【正确答案】 C 【试题解析】 赋值运算符只能作为类的成员函数重载。 【知识模块】 运算符重载 15 【正确答案】 C 【试题解析】 此题考查模板的概念。模板的一般说明形式如下: template类型形参表函数返回值类型函数名 (形参表 )函数体 ,所以选项 A、 B正确。函数模板的实参在一定条件下是可以省略的, 所以选项 C错误。 【
7、知识模块】 模板 16 【正确答案】 C 【试题解析】 此题考查的是函数模板的使用。引用模板函数和引用一般函数在语法形式上基本相同。需要注意的是说明一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中的对应形参。本题 C选项中,编译系统从第一个参数 “3”获得信息 “int”和从第二个参数获得信息 “double”两者矛盾,错误; A、 B选项正确: D选项中,函数名后的 是模板实参表,编译系统会将 double型的形参 “5 5”自动转 化成 int类型。 【知识模块】 模板 17 【正确答案】 D 【试题解析】 此题考查的是模板函数的调用。本题中
8、 cast()函数的实参 i只能确定模板参数 U的类型为 int,而不能确定另外一个模板参数 T,故选项 A、 B错误; C+语言不允许隐式地将 int转化为 char*,故选项 C错误。 【知识模块】 模板 18 【正确答案】 D 【试题解析】 此题考查的是模板实参的省略。模板实参在以下集中情况中不能省略:从模板函数实参表获得的信息有矛盾;需要获得特定类型的返回值,而不管参数的类型如何 ;虚拟类型参数没有出现在模板函数的形参表中:函数模板含有常规形参。 【知识模块】 模板 19 【正确答案】 C 【试题解析】 此题考查的是函数模板。声明一个函数模板的格式是: template模板形参表声明函
9、数声明, 函数体 其中的模板形参表声明是由一个或多个“模板形参 ”组成的,每个 “模板形参 ”可具有以下几种形式: typename参数名;class参数名,类型修饰参数名。 【知识模块】 模板 20 【正确答案】 A 【试题解析】 此题考查的是函数模板。声明一个函数模板的 格式是: template模板形参表声明函数声明,其中的模板形参表声明是由一个或多个 “模板形参 ”组成的,每个 “模板形参 ”可具有以下几种形式: typename参数名; class参数名;类型修饰参数名。 【知识模块】 模板 21 【正确答案】 C 【试题解析】 此题考查的是模板。在 C+语言中,模板有两类:函数模板
10、和类模板。 【知识模块】 模板 22 【正确答案】 B 【试题解析】 此题考查的是模板的概念。函数模板可以含有常规形参;函数模板的一个实例就是一个函数定义;类模板 中的成员函数都是模板函数;在用类模板定义对象时,由于没有像函数实参表这样的额外信息渠道,因此无法按函数模板的方式省略模板形参,但是可以为类模板的参数设置默认值。 【知识模块】 模板 23 【正确答案】 A 【试题解析】 此题考查的是函数模板的声明。声明一个函数模板的格式是:template函数声明;定义类模板的格式是: template类型形参表 class类模板名 ;。 【知识模块】 模板 24 【正确答案】 C 【试题解析】 在
11、声明模板参数是,关键 字 typename和 class是可以互换的,两者是等价的。但选项 C中说的是模版声明,在类模板声明中,替换可能会引起麻烦。 【知识模块】 模板 25 【正确答案】 D 【试题解析】 在调用一个模板函数时,如果编译系统能够从模板实参表判断其中或全部虚拟类型参数对应的实际参数,而且它们正好是参数表中最后的若干参数,刚模板实参表中的那几个参数可以省略。 【知识模块】 模板 26 【正确答案】 B 【试题解析】 声明一个函数模板的格式是: template模板形参表声明 函数声明,其中的模板形参表声明是由一个或多个模板形参组成 (如果是多个,需要用逗号隔开 )。每个模板形参具
12、有下面的几种形式: typename参数表 class参数名 类型修饰 参数名 由此可知,模板形参表必须用括弧括起来,而不是 (),所以选项 B为正确答案。 【知识模块】 模板 27 【正确答案】 D 【试题解析】 类模板就是一系列相关类的模型或样板,这些类的成员组成相同,成员函数的源代码形式相同,所不同的只是所针对的类 型 (成员的类型以及成员函数的参数和返回值的类型 )。一个类模板的格式是: template模板形参表声明类声明,模板形参表声明是由一个或多个模板形参组成。在定义类模板时,可以为模板形参表声明的最后若干个参数设置默认值。 【知识模块】 模板 28 【正确答案】 C 【试题解析】 对于函数模板,数据类型本身成了它的参数,是一种参数化类型的函数。对于类模板,数据类型本身成了它的参数,因而是一种参数化类型的类,是类的生成器。 【知识模块】 模板 29 【正确答案】 D 【 试题解析】 虚拟类型参数 T1没有出现在模板函数的形参表中,因此在调用时不可能从模板函数的实参表中获得相应的信息,因此 T1无法省略。而在选项 D中省略了。 【知识模块】 模板