运算符重载一.单项选择题1.下列运算符中,运算符在C++中不能重载。
A .?:B.+C.D.<=解: C++中不能被重载的运算符有:·,一,::,?:。
本题答案为A。
2.下列运算符中,运算符在C++中不能重载。
A .&& B.[]C.::D.newc。
解: 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 C. a,c都必须是Com 的对象都必须是Com 的对象B. a,bD. b,c都必须是都必须是Com 的对象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=mint &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<iostreamclass Sample{. h>private:int x;public:Sample(){x=0; }void disp(){cout<< void 0perator++(){x+=10”x=”<<x<<endl;; }}}void main() {Sample obj obj . disp();;obj++;cout<<“执行。
obj . disp();bj++ 之后”<<endl;}解:在类该对象的Sample 中设计运算符重载成员函数,使运算符“x 增 10。
本题答案为:++”作为于Sample 类对象时,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 除的结果。