1、国家二级 C+机试(运算符重载)模拟试卷 5及答案解析(总分:42.00,做题时间:90 分钟)一、选择题(总题数:21,分数:42.00)1.运算符重载是对已有的运算符赋予多重含义,因此( )。(分数:2.00)A.可以对基本类型(如 int类型)的数据,重新定义“+”运算符的含义B.可以改变一个已有运算符的优先级和操作数个数C.只能重载 C+中已经有的运算符,不能定义新运算符D.C+中已经有的所有运算符都可以重载2.关于运算符重载,下列表述中正确的是( )。(分数:2.00)A.C+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需要声
2、明返回类型D.可以通过运算符重载来创建 C+中原来没有的运算符3.通过运算符重载,可以改变运算符原有的( )。(分数:2.00)A.操作数类型B.操作数个数C.优先级D.结合性4.下列运算符中,不能被重载的是( )。(分数:2.00)A.,下列关于这个函数的叙述中,错误的是( )。(分数:2.00)A.这是运算符的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变类的任何数据成员的值15.在表达式 x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是( )。(分数:2.00)A.。perator+有两个参数,
3、operator*有两个参数B.operator+有两个参数,operator*有一个参数C.operator+有一个参数,operator*有两个参数D.operator+有一个参数,operator*有一个参数16.有如下程序: #inc1udeiostream using namespace std; c1ass Comp1ex double re,im; public: Comp1ex(double r,double i):re(r), im(i) double real()constreturn re, double image()constreturn im; Comp1ex im
4、+=aim; return *this; ;ostream cout(x+=y)end1; retum 0; 执行这个程序的输出结果是( )。(分数:2.00)A.(1,2)B.(2,3)C.(3,5)D.(3,1)17.有如下的运算符重载函数定义: double operator +(int i,int k) return double(i+k); 但定义有错误,对这个错误最准确的描述是( )。(分数:2.00)A.+只能作为成员函数重载,而这里的+是作为非成员函数重载的B.两个 int型参数的和也应该是 int型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类
5、的友元D.C+已经提供了求两个 int型数据之和的运算符+,不能再定义同样的运算符18.下面程序中对一维坐标点类 Point进行运算符重载 #inc1udeiostream using namespace std; c1ass Point public: Point(int val)x=val,) Pointreturn *this; Point operator+(int)Point old=*this; H(*this);return old;) Int GetX()const return x, private: int X; ); int main() Point a(10); cou
6、nt(+a)GetX(); couta+GetX(); retum0; 编译和运行情况是( )。(分数:2.00)A.运行时输出 1011B.运行时输出 1111C.运行时输出 1112D.编译有错19.下列运算符函数中肯定不属于类 FunNumber的成员函数的是( )。(分数:2.00)A.int operator(FunNumber);B.FunNumber operator0;C.FunNumberoperator(int),D.int operator(FunNumber; FunNumber);20.下列是重载乘法运算符的函数原型声明,其中错误的是( )。(分数:2.00)A.My
7、Class operator*(double,double);B.MyClass operator*(double,MyClass);C.MyClassoperator*(MyClass,double);D.MyClass operator*(MyClass,MyClass);21.己知 Value是一个类,Value 是 Value的一个对象。下列以非成员函数形式重载的运算符函数原形中,正确的是( )。(分数:2.00)A.Value operator+(Value v,int i);B.Value operator+(Value v=value, int i);C.Value operat
8、or+(Value vint i=0);D.Value operator+(Value v=value,int i=0),国家二级 C+机试(运算符重载)模拟试卷 5答案解析(总分:42.00,做题时间:90 分钟)一、选择题(总题数:21,分数:42.00)1.运算符重载是对已有的运算符赋予多重含义,因此( )。(分数:2.00)A.可以对基本类型(如 int类型)的数据,重新定义“+”运算符的含义B.可以改变一个已有运算符的优先级和操作数个数C.只能重载 C+中已经有的运算符,不能定义新运算符 D.C+中已经有的所有运算符都可以重载解析:解析:此题考查的是运算符重载。运算符重载是针对 C+
9、语言原有的运算符进行的,并不能创造新的运算符。2.关于运算符重载,下列表述中正确的是( )。(分数:2.00)A.C+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需要声明返回类型 D.可以通过运算符重载来创建 C+中原来没有的运算符解析:解析:此题考查的是运算符重载的概念。C+语言规定,“,”、“*”、“”、“”和“?:”这五个运算符不能被重载,故选项 A错误;运算符函数的返回类型由该运算符所组成的表达式的值的类型来决定,故选项 B说法是错误的;运算符重载是针对原有运算符,并不能通过重载创造出新的运算符,故选项 D错误。3.通过运算符重
10、载,可以改变运算符原有的( )。(分数:2.00)A.操作数类型 B.操作数个数C.优先级D.结合性解析:解析:此题考查的是运算符重载。运算符重载具有保持其原有的操作数个数、优先级、语法结构和结合性不变的特性。故本题选项 A正确。4.下列运算符中,不能被重载的是( )。(分数:2.00)A.,下列关于这个函数的叙述中,错误的是( )。(分数:2.00)A.这是运算符的重载运算符函数B.这个函数所重载的运算符是一个一元运算符 C.这是一个成员函数D.这个函数不改变类的任何数据成员的值解析:解析:此题考查的是运算符的重载。运算符“”有一元和二元两种,在本题中它作为一个二元运算符,所以它不能更新对象
11、的数据成员,也不能调用该类中没有 const修饰的成员函数。15.在表达式 x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是( )。(分数:2.00)A.。perator+有两个参数,operator*有两个参数B.operator+有两个参数,operator*有一个参数C.operator+有一个参数,operator*有两个参数 D.operator+有一个参数,operator*有一个参数解析:解析:此题考查的是运算符的重载。运算符可重载成员函数,也可重载为友元函数。当重载为成员函数时,运算符重载函数的形参个数要比运算符操作数的个数少一个:
12、当重载为友元函数时,其参数个数应与操作数的个数相同。16.有如下程序: #inc1udeiostream using namespace std; c1ass Comp1ex double re,im; public: Comp1ex(double r,double i):re(r), im(i) double real()constreturn re, double image()constreturn im; Comp1ex im+=aim; return *this; ;ostream cout(x+=y)end1; retum 0; 执行这个程序的输出结果是( )。(分数:2.00)A
13、.(1,2)B.(2,3)C.(3,5)D.(3,1) 解析:解析:此题考查了运算符重载应用。因为 x和 y都是 Comp1ex类的对象,Comp1ex 类中已经重载了+=运算符,表达式 x+=y就等价与 xoperator+=(y),执行后得到(3,1);按着计算 cout(x+=y),其等价子调用 operator(cout,(x+=y),最后输出结果是(3,1)。17.有如下的运算符重载函数定义: double operator +(int i,int k) return double(i+k); 但定义有错误,对这个错误最准确的描述是( )。(分数:2.00)A.+只能作为成员函数重载
14、,而这里的+是作为非成员函数重载的B.两个 int型参数的和也应该是 int型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类的友元D.C+已经提供了求两个 int型数据之和的运算符+,不能再定义同样的运算符 解析:解析:此题考查的是运算符的重载。C+语言规定,不能作为非成员函数重载的运算符有=、()、以及所有的类型转换运算符,故选项 A错误:运算符重载对返回值类型没有限制,故选项 B错误;C+并不强制要求非成员重载的运算符一定是某个类的友元,所以 C选项错误:题目中重载的“+”运算符的两个参数都是 int类型,而 C+已经提供了求两个 int型数据之和的运算符+
15、,编译器无法区分应该调用哪一个,所以应该选择 D选项。18.下面程序中对一维坐标点类 Point进行运算符重载 #inc1udeiostream using namespace std; c1ass Point public: Point(int val)x=val,) Pointreturn *this; Point operator+(int)Point old=*this; H(*this);return old;) Int GetX()const return x, private: int X; ); int main() Point a(10); count(+a)GetX();
16、couta+GetX(); retum0; 编译和运行情况是( )。(分数:2.00)A.运行时输出 1011B.运行时输出 1111 C.运行时输出 1112D.编译有错解析:解析:此题考查的是重载增 l运算符“+”。此题中,Point第 2条输出语句,首先创建了一个 Point对象 old保存自身,然后通过语句+(*this);调用前缀+的重载函数,因为返回值是改变前保存的 old对象,故仍输出 11。19.下列运算符函数中肯定不属于类 FunNumber的成员函数的是( )。(分数:2.00)A.int operator(FunNumber);B.FunNumber operator0;
17、C.FunNumberoperator(int),D.int operator(FunNumber; FunNumber); 解析:解析:此题考查的是运算符“”的重载。“”运算符有一元和二元两种,且均可以重载为成员函数和非成员函数。运算符重载为成员函数时,形参个数一般为运算符元数减 1:重载为非成员函数时,形参个数一般和运算符元数相等。所以,“”运算符重载为成员函数时,参数可以是 0个或 1个:而重载为非成员函数时,参数个数可以是 1个或 2个。所以 D选项,肯定是重载为非成员函数。20.下列是重载乘法运算符的函数原型声明,其中错误的是( )。(分数:2.00)A.MyClass operat
18、or*(double,double); B.MyClass operator*(double,MyClass);C.MyClassoperator*(MyClass,double);D.MyClass operator*(MyClass,MyClass);解析:解析:此题考查的是运算符重载。本题中,选项 A重载运算符“*”使用的形参是两个 double,而系统中的“*”运算原本就能计算两个 double,所以这样违反了重载函数的原则,当执行 a*b这样的表达式时,系统不能识别是否执行运算符重载函数。故答案是 A选项。21.己知 Value是一个类,Value 是 Value的一个对象。下列以非成员函数形式重载的运算符函数原形中,正确的是( )。(分数:2.00)A.Value operator+(Value v,int i);B.Value operator+(Value v=value, int i); C.Value operator+(Value vint i=0);D.Value operator+(Value v=value,int i=0),解析:解析:此题考查的是重载加法运算符“+”。“+”是二元运算符,其第一操作数是对象本身,i 为第二操作数,由此可知选项 B正确。