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

合集下载

运算符重载基础概念练习题

运算符重载基础概念练习题

运算符重载基础概念练习题1、下列运算符中,()运算符在C++中不能重载。

A=B()C::Ddelete2、下列运算符中,()运算符在C++中不能重载。

A:B[]CnewD&&3、下列关于C++运算符函数的返回类型的描述中,错误的是()。

A可以是类类型B可以是int类型C可以是void类型D可以是float类型4、下列运算符不能用友元函数重载的是()。

A+B=C某D<<5、在重载运算符函数时,下面()运算符必须重载为类成员函数形式。

A+B-C++D->6、下列关于运算符重载的描述中,正确的是()A运算符重载可以改变运算符的操作数的个数B运算符重载可以改变优先级C运算符重载可以改变结合性D运算符重载不可以改变语法结构7、友元运算符obj>obj2被C++编译器解释为()。

Aoperator>(obj1,obj2)B>(obj1,obj2)Cobj2.operator>(obj1)Dobj1.oprator>(obj2)8、在表达式某+y某z中,+是作为成员函数重载的运算符,某是作为非成员函数重载的运算符。

下列叙述中正确的是()。

Aoperator+有两个参数,operator某有两个参数Boperator+有两个参数,operator某有一个参数Coperator+有一个参数,operator某有两个参数Doperator+有一个参数,operator某有一个参数9、重载赋值操作符时,应声明为()函数。

A友元B虚C成员D多态10、在一个类中可以对一个操作符进行()重载。

A1种B2种以下C3种以下D多种11、在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。

A.作为友元函数重载的1元运算符B.作为成员函数重载的1元运算符C.作为友元函数重载的2元运算符D.作为成员函数重载的2元运算符12、在成员函数中进行双目运算符重载时,其参数表中应带有()个参数。

运算符重载知识题

运算符重载知识题

.《面向对象程序设计》习题班级:学号:姓名:名单序号:成绩:第7章运算符重载和多态性一、选择题(共30分,每题1分)1.下列运算符中,()运算符在C++中不能重载。

A.?:B.[]C. newD.++2.友元重载运算符obj1>obj2被C++编译器解释为()。

A.operator >(obj1,obj2) B.>(obj1,obj2)C.obj2.operator >(obj1) D.obj1.operator >(obj2)3.重载赋值操作符时,应声明为()函数。

A.友元B.虚C.成员D.多态4.在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。

A. 作为友元函数重载的1元运算符B. 作为成员函数重载的1元运算符C. 作为友元函数重载的2元运算符D. 作为成员函数重载的2元运算符5.在重载一运算符时,若运算符函数的形参表中没有参数,则不可能的情况是()。

A. 该运算符是一个单目运算符。

B. 该运算符函数有一个隐含的参数this。

C. 该运算符函数是类的成员函数。

D. 该运算符函数是类的友元函数。

6. 关于运输符重载,下列表述中正确的是()。

A.C++已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型. C.在类型转换符函数的定义中不需要声明返回类型D.可以通过运算符重载来创建C++中原来没有的运算符7. C ++流中重载的运算符>>是一个()。

A. 用于输出操作的非成员函数B. 用于输出操作的成员函数C. 用于输入操作的非成员函数D. 用于输入操作的成员函数8. 若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是()。

A. Data +(Data);B. Data operator+(Data);C. Data +operator(Data);D. operator +(Data, Data);9. 下列运算符中哪些是不能够被重载的()。

9.6.2 运算符重载[共11页]

9.6.2 运算符重载[共11页]
9.6 函数重载和运算符重载 217
答案 C
面试例题 34:重载和覆写有什么区别?
考点:重载和覆写之间区别的理解。 出现频率:★★★★ 解析 重载(overriding)是指子类改写父类的方法;覆写(overloading)是指同一个函数的不同 版本之间参数不同。 重载是编写一个与已有函数同名但是参数表不同(参数数量或参数类型不同)的方法,它 具有如下所示的特征。 方法名必须相同。 参数列表必须不相同,与参数列表的顺序无关。 返回值类型可以不相同。 覆写是派生类重写基类的虚函数,它具有如下所示的特征。 只有虚方法和抽象方法才能够被覆写。 具有相同的函数名。 具有相同的参数列表。 具有相同的返回值类型。 重载是一种语法规则,由编译器在编译阶段完成,不属于面向对象的编程;而覆写是由运 行阶段决定的,是面向对象编程的重要特征。
面试例题 35:编程题—MyString 类的编写。
考点:重载=和+运算符。
出现频率:★★★
对于下面的类 MyString,要求重载运算符后可以计算表达式 a=b+c(a、b、c 都是类 MyString
的对象)。请重载相应的运算符并编写程序测试。
1 class MyString
2{
3 public:
218 第 9 章 C++面向对象
在少数情况下重载 new、delete 运算符。 运算符重载需要遵循以下所示的规则; 重载的运算符不能违反语言的语法规则。 如果一个运算符可以放在两个操作数之间,就可以重载它来满足类操作的需要,哪怕
这种用法原本为编译器所不能接受。 不能创造 C++语言中没有的运算符。 重载时不能改变运算符的优先级。
个是“=”运算符,用于对象 a 的赋值。程序代码如下:

运算符重载自考习题

运算符重载自考习题

2000.1019、重载的运算符仍然保持其原来的优先级、结合性和____________。

25、下面程序希望产生的输出为4+3i,但是运行输出是3+3i,请指出错误并改正#include <iostream.h>class complex {int real; // 实部int imag; // 虚部public:complex(int r=0,int i=0): real(r),imag(i) {}void show() { cout<<real<<"+"<<imag<<"i"<<endl;}complex operator++() { real++; return * this; }};void main() {complex c(2,3);++++c;c.show();}Key:complex &operator++() { real++; return * this; }2001.1029.下面是类fraction(分数)的定义,其中重载的运算符<<以分数形式输出结果,例如将三分之二输出为2/3。

在横线处填上适当字句。

class fraction{int den; //分子int num; //分母friend ostream& operator<<(ostream&,fraction);…};ostream& operator <<(ostream& os,fraction fr){_________;return _________;}29.os<<fr.den<<′/′<<fr.num os2002.106.如果表达式++i*k中的“++”和“*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为( )A.operator*(i.operator++(),k)B.operator*(operator++(i),k)C.i.operator++().operator*(k)D.k.operator*(operator++(i))33.写出下面程序的输出结果。

C++运算符重载题库及答案

C++运算符重载题库及答案

运算符重载一.单项选择题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<运算符>(<参数,<参数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++解释为:(3)A)c.o p e r a t o r++(m);B)m=o p e r a t o r++(m);C)m.o p e r a t o r++(m);D)o p e r a t o r++(m);class fun{public:....f u n o p e r a t o r+=(f u n);f r i e n d f u n o p e r a t o r++(f u n&,i n t);};答案:D7.在第33题中,当执行语句d+=m;时,C++编译器对语句作如下解释:(34)A.d=operator+=(m);B.m=operator+=(d);C. d.operator+=(m);D.m.operator+=(d);答案:C8.设有以下类定义,其中说明了“+”运算符重载函数的原型。

第11章运算符重载

第11章运算符重载

运算符重载函数是类成员函数
一元运算符 @表示要重载的运算符 表示要重载的运算符 隐式调用: 对象名 对象名@ 隐式调用:@对象名 或者 对象名 显示调用:对象.operator@( ) 显示调用:对象 二元运算符 隐式调用:对象名 对象名2 隐式调用:对象名1@对象名 对象名 显示调用:对象名1.operator@(对象名 对象名2) 显示调用:对象名 对象名
例如:下边是运算符重载的另一个例子,程序实现了复数的加 例如:下边是运算符重载的另一个例子, 和减运算。(二元操作符) 。(二元操作符 和减运算。(二元操作符)
#include <iostream> using namespace std; class Complex { public: Complex() { real=0.0;imag=0.0; } Complex(double r) { real=r; imag=0.0; } Complex(double r,double i) { real=r; imag=i; } Complex operator+(const Complex& c); Complex operator-(const Complex& c); friend void print(const Complex& c); private: double real,imag; };
运算符重载为友元函数形式
注意: 注意:友元函数重载运算符调用方式 @表示要重载的运算符 表示要重载的运算符 二元运算符 显示: 对象名1,对象名 显示:operator@(对象名 对象名 对象名 对象名2) 隐式:对象名1@对象名 对象名2 隐式:对象名 对象名 一元运算符 显示: 对象名) 显示:operator@(对象名 对象名 隐式: 对象名 对象名@ 隐式:@对象名 或者 对象名

第11章 运算符重载

第11章 运算符重载
15
► 1.
双目运算符重载为类的友元函数,形式如下:
所属类型 &obj1)
返回类型 operator op(const 所属类型 &obj1,const { …… // obj1和obj2分别对应两个运算对象 }
“obj1 op obj2” ► 相当于operator op(obj1,obj2)
► 经过重载后,表达式
17
15complex operator +(const complex &c1,const complex &c2) 16{ complex c3; 17 c3.real=c1.real+c2.real; 18 c3.imag=c1.imag+c2.imag; 19 return c3; 20 } 21complex operator -(const complex &c1,const complex &c2) 22{ complex c3; 23 c3.real=c1.real-c2.real; 24 c3.imag=c1.imag-c2.imag; 25 return c3; 26 } 27 int main() 28 { complex c1(1,2),c2(3,4),c3; 29 30 //输出4+6i c3=c2+c1; c3.display(); 31 c3=c2-c1; c3.display(); //输出2+2i return 0; 32 }
5
► 1.
双目运算符重载为类的成员函数,形式如下: 返回类型 类名::operator op(const 所属类型 { …… //this指针对应obj1运算对象 }
&obj2)

习题3参考答案

习题3参考答案

习题参考答案第3章多态性3.1 简答题3.1.1哪些运算符可以重载?几乎所有的运算符都可以重载,除了以下的几个运算符:., ::,?:3.1.2运算符重载后,优先级和结合性如何?用户重新定义运算符,不改变原运算符的的优先级和结合性。

同时运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。

3.1.3编译程序如何选用运算符函数?在每一种编译系统中,运算符实际上都对应一个函数,只是这种运算对用户具有透明性,使用者并不知道函数的存在。

运算符重载实际上是运算符函数的重载,所以运算符的重载实际上是函数的重载。

编译程序对运算符重载的选择,遵循着函数重载的选择原则。

当遇到不很明显的运算符时,编译程序将去寻找参数相匹配的运算符函数。

3.1.4重载运算符有哪些限制?(1)不可臆造新的运算符(2)坚持四个不能改变。

●不能改变运算符原有的优先级●不能改变运算符原有的结合性●不能改变运算符原有的语法结构●不能改变运算符原有的操作数个数但允许改变运算符的返回类型(3)C++规定,运算符中,参数类型都是内部类型时,不允许重载。

“::、*、->、?:”这五个运算符不能重载。

3.1.5运算符重载必须遵循哪些原则?运算符重载可以使程序更加简洁,使表达式更加直观,增强可读性。

但是,运算符重载使用不宜过多,否则会带来一定的麻烦。

运算符重载必须遵循以下原则:(1)重载运算符含义必须清楚。

(2)重载运算符不能有二义性。

3.2 填空题3.2.1 C++中多态性包括两种多态性:(1)和(2)。

前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。

答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数3.2.2 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质是将指向函数体的指针定为(3)。

答案:(1)=0(2)不定义(3)NULL3.2.3在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和(3)完全一样就认为是虚函数,而不必再加关键字(4)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第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个私有数据成员,分别存放一个日期的月份、日号和年份。

相关文档
最新文档