运算符重载一.单项选择题1.下列运算符中,运算符在C++中不能重载。
A.?: B.+ C. D.<=2.下列运算符中,运算符在C++中不能重载。
A.&& B.[] C.:: D.new3.下列关于运算符重载的描述中,是正确的。
A.运算符重载可以改变操作数的个数B.运算符重载可以改变优先级C.运算符重载可以改变结合性D.运算符重载不可以改变语法结构4.友元运算符objl>obj2被C++编译器解释为。
A.operator>(objl,obj2) B.>(obj1,obj2)C.obj2.operator:>(obj1) D.objl.operator>(obj2) 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++解释为: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);};7. 在第6题中,当执行语句d+=m; 时,C++编译器对语句作如下解释:A. d=operator+=(m);B. m=operator+=(d);C. d.operator+=(m);D. m.operator+=(d);8. 设有以下类定义,其中说明了“+”运算符重载函数的原型。
这是一个友元函数,当类外有语句a=b+c;访问这个友元函数时,C++编译器把对语句a=b+c;解释为:operator +(b,c)其中:A. a,b,c都必须是Com的对象B. a,b都必须是Com的对象C. a,c都必须是Com的对象D. b,c都必须是Com的对象class Com{ ... ...friend Com operator +(... ...);};二.填空题1.利用成员函数对双目运算符重载,其左操作数为,右操作数为。
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<<”n=”<<n<<endl;) }void main(){Sample s(10);(S--)++;S.disp();}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();}3.阅读下面的程序,在空白处填写出程序运行后的结果。
#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个私有数据成员,分别存放一个日期的月份、日号和年份。
其成员函数有:两个构造函数,disp0成员函数用于显示日期,“+”运算符重载为计算指定日期加上指定天数后的日期。
本程序输出2003年2月10日加上365天后的日期,结果为:2/10/2004。
2.说明以下类Words的功能,并给出程序执行结果。
#include<iostream.h>#include<string.h>class Words{char *str;public:Words(char *s){str=new char[strlen(s)+1];strcpy(str,s);}void disp(){cout<<str<<endl;}char operator[](int i){if(str[i]>=’A’&& str[i]<='Z') // 大写字母return char(str[i]+32);else if(str[i]>='a'&&str[i]<='z') // 4'写字母return char(str[i]-32);else // 其他字符return str[i];}}void main(){int i;char *s=”Hello”;Words word(s);word.disp();for(i=0;i<strlen(s);i++)cout<<word[i];cout<<endl:}解:Words类含有一个私有数据,其成员函数有:一个构造函数,disp()函数用于输出str,下标运算符重载函数用于将指定下标的字母大小写互换,其他字符时不变。