当前位置:文档之家› 第11章 运算符重载 习题解答

第11章 运算符重载 习题解答

第11章运算符重载一.单项选择题1.下列运算符中,运算符在C++中不能重载。

A.?: B.+ C. D.<=解:C++中不能被重载的运算符有:·,一,::,?:。

本题答案为A。

2.下列运算符中,运算符在C++中不能重载。

A.&& B.[] C.:: D.new解:c++中不能被重载的运算符有:·,·+,::,?:。

本题答案为c。

3.下列关于运算符重载的描述中,是正确的。

A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构解:运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算程的语法结构。

本题答案为D。

4.友元运算符objl>obj2被C++编译器解释为。

A.operator>(objl,obj2) B.>(obj1,obj2)C.obj2.operator:>(obj1) D.objl.operator>(obj2)解:重载为友元函数的运算符的调用形式如下:operator<运算符>(<参数1>,<参数2>)等价于:<参数1><运算符><参数2>本题答案为A。

5.现需要对list类对象使用的逻辑运算符“==”重载,以下函数声明是正确的。

A、list & list::operator==(const list &a);B、list list::operator==(const list &a);C、bool & list::operator==(const list &a);D、bool list::operator==(const list &a);6. 以下类中分别说明了“+=”和“++”运算符重载函数的原型。

如果主函数中有定义:fun m,c,d;,那么,执行语句c=m++; 时,编译器把m++解释为: (33)A) c.operator++(m); B) m=operator++(m);C) m.operator++(m); D) operator++(m);class fun{ public:.. .. ..fun operator +=(fun );friend fun operator ++(fun &,int);};答案:D7. 在第33题中,当执行语句d+=m; 时,C++编译器对语句作如下解释: (34)A. d=operator+=(m);B. m=operator+=(d);C. d.operator+=(m);D. m.operator+=(d);答案:C8. 设有以下类定义,其中说明了“+”运算符重载函数的原型。

这是一个友元函数,当类外有语句a=b+c;访问这个友元函数时,C++编译器把对语句a=b+c;解释为:operator +(b,c)其中: (35)A. a,b,c都必须是Com的对象B. a,b都必须是Com的对象C. a,c都必须是Com的对象D. b,c都必须是Com的对象class Com{ ... ...friend Com operator +(... ...);};答案:B二.填空题1.利用成员函数对双目运算符重载,其左操作数为,右操作数为。

解:将双目运算符重载为类的成员函数时,由于this指针在每次非静态成员函数操作对象时都作为第一个隐式参数传递给对象,因此它充当了双目运算符的左操作数,而该成员函数的形参则表示双目运算符的右操作数。

本题答案为:this指针成员函数参数。

2.运算符重载仍然保持其原来的优先级、和。

解:运算符重载不能改变操作数的个数、运算符的优先级、运算符的结合性和运算符的语法结构。

本题答案为:结合性语法结构。

3.为了满足运算符“+”的可交换性,必须将其重载为。

解:以友元函数方式重载运算符可满足运算符“+”的可交换性,因为两个操作数都作为参数,例如,有以下程序:#include<iostream.h>class Sample{int n;public:Sample(){}Sample(int i){n=i;}friend Sample operator+(Sample,Sample);void disp() {cout<<“n=”<<n<<endl; }}Sample operator+(sample s1,Sample s2){return sample(S1.n+s2.n);}void main(){Sample S1(2),s2(5),s3;cout<<”S1:”;S1.disp();cout<<”s2:”;s2.disp();s3=S1+S2;cout<<”s3:”; s3.disp();S3=S2+S1;cout<<”s3:”;s3.disp();}程序执行结果如下:从中看到,执行sl+s2和s2+sl的结果是相同的,从而满足运算符“+”的交换性。

所以本题答案为:友元函数。

4.在c++中,运算符的重载有两种实现方法,一种是通过成员函数来实现,另一种则通过(4) 来实现。

答案:友元5. 当用成员函数重载双目运算符时,运算符的左操作数必定是: (5)答案:对象三.程序分析题1.以下程序的执行结果是。

#include<iostream.h>class Sample{int n;public:Sample(){)Sample(int m){n=m;)int &operator--(int){n--;return n;}void disp() { cout<<”rl=”<<n<<endl;)}void main(){Sample s(10);(S--)++;S.disp();}解:该程序中,类Sample的重载”一”运算符的成员函数返回Sample对象的私有数据成员n的引用。

在main()函数中执行(s--)++;语句时,先调用重载成员函数,使S对象的n值减1,这时返回的是S对象的n的引用,再执行++运算,也就是对s对象的n值执行++运算,所以s对象的11值保持不变。

程序的执行结果为:n=lO。

2.以下程序的执行结果是:#include<iostream.h>class Sample{private:int x;public:Sample(){x=0;}void disp(){cout<<”x=”<<x<<endl;}void 0perator++(){x+=10;}}void main(){Sample obj;obj.disp();obj++;cout<<“执行。

bj++之后”<<endl ;obj.disp();}解:在类Sample中设计运算符重载成员函数,使运算符“++”作为于Sample类对象时,该对象的x增10。

本题答案为:x=0执行obj++之后x=103.阅读下面的程序,在空白处填写出程序运行后的结果。

#include<iostream.h>class complex{float real,imag,public:complex(float r,float i){real=r;imag=i;}complex(){real=O; imag=O;}void print();friend complex operator+(complex a,complex b);friend complex operator一(complex a,complex b);friend complex operator‘(complex a,complex b);friend complex operator/(complex a,complex b);}void complex::print(){cout<<real:if(imag>O)cout<<”+”;if(imag!:0) cout<<imag<<”i”<<endl;}complex operator+(complex a,complex b){complex temp;temp.real=a.real+b.real;temp.imag=a.imag+b.imag;return temp;}complex operator-(complex a,complex b){complex temp ;temp.real=a.real-b.real;temp.imag=a.imag-b.imag;return temp;}complex operator *(complex a,complex b){complex temp;temp.real:a.real*b.real-a.imag *b.imag;temp.imag=a.real *b.imag+a.imag *b.real;return temp;}complex operator/(complex a,complex b){complex temp;float tt;tt=l/(b.real‘b.real+b.imag。

b.imag);temp.real=(a.real*b.real+a.imag*b.imag)*tt;temp.imag=(b.real*a.imag-a.real*b.imag)*tt;return temp;}void main(){complex c1(2.3,4.6),c2(3.6,2.8),c3;c1.print();c2.print();c3=c1+c2;c3.print();c3=c1-c2;c3.print();c3=c1*c2 ;c3.print();c3=c1/c2;c3.print();}程序运行结果为:2.3+4.6i3.6+2.8i(1)(2)(3)(4)解:(1)、(2)、(3)和(4)分别是2.3+4.6i和3.6+2.8i两个复数相加、相减、相乘和相除的结果。

本题答案为:(1)5.9+7.4i (2)-1.3+1.8i (3)-4.6+23i;(4)A.1.01731+0.486538i。

四.简答题1.说明以下类date的功能,并给出程序执行结果。

#include<iostream.h>static int dys[]={31,28,31,30,31,30,31,31,30,31,30,31);c1ass date{int mo ,rda, ryr;public:date(int m,int d,int y){mo=m;da=d;yr=y;}date(){}void disp(){cout<<mo<< ”/”<<da<<“/”<<yr<<endl;}friend date operator+(date &d,int day) // 运算符重载友元函数{date dt;dt.mo=d.mo;dt.yr=d.yr;day+=d.da;while(day>dys[dt.mo-1]){day-=dys[dt.mo-1];if(++dt.mo==13){dt.mo=1;dt.yr++;}}dt.da=day;.return dt;}}void main(){date dl(2,10,2003),d2;d2=dl+365;d2.disp();}解:类date含有mo、da和),r 3个私有数据成员,分别存放一个日期的月份、日号和年份。

相关主题