c++运算符的重载习题答案
运算符重载基础概念练习题
运算符重载基础概念练习题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、在成员函数中进行双目运算符重载时,其参数表中应带有()个参数。
c 运算符的重载习题答案
1.概念填空题1.1运算符重载是对已有的运算符赋予多重含义,使同一个运算符在作用于不同类型对象时导致不同的行为。
运算符重载的实质是函数重载,是类的多态性特征。
1.2可以定义一种特殊的类型转换函数,将类的对象转换成基本数据类型的数据。
但是这种类型转换函数只能定义为一个类的成员函数而不能定义为类的友元函数。
类类型转换函数既没有参数,也不显式给出返回类型。
类类型函数中必须有return 表达式的语句返回函数值。
一个类可以定义多个类类型转换函数。
1.3运算符重载时其函数名由operator运算符构成。
成员函数重载双目运算符时,左操作数是对象,右操作数是函数参数。
2.简答题2.2简述运算符重载的规则。
2.2简述重载单目运算符++、--,前置和后置时的差别。
2.3 C++中重运算符是否都可以重载?是否都可以重载成类的成员函数?是否都可以重载成类的友元函数?2.4 构造函数作为类型转换函数的条件是什么。
3.选择题3.1在下列运算符中,不能重载的是(B)A.!B. sizeofC. newD. delete3.2 不能用友员函数重载的是(A)。
A.=B.==C.<=D.++3.3下列函数中,不能重载运算符的函数是(B)。
A.成员函数B.构造函数C.普通函数D.友员函数3.4如果表达式++i*k时中的”++”和”*”都是重载的友元运算符,则采用运算符函数调用格式,该表达式还可表示为(B)。
A.operator*(i.operator++(),k) B.operator*(operator++(i),k)C.i.operator++().operator*(k) D.k.operator*(operator++(i))3.5已知在一个类体中包含如下函数原型:VOLUME operator-(VOLUME)const;下列关于这个函数的叙述中,错误的是(B )。
A.这是运算符-的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变数据成员的值3.6在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。
最新《C++程序设计案例教程》习题答案第10章 运算符重载
第10章运算符重载一、选择题1.A2.D3.A4.B5.D6.C二、写出下列程序运行结果(略)三、简答题1.(1)只能重载已有的C++运算符,不可自创新的运算符。
(2)重载后运算符的优先级和结合性都不变。
(3)重载的功能应当与原有功能相类似。
2.: : . .* ? : sizeof typeid 3.&& | | ,四、编程题1.#include<iostream>class MyString{public:MyString(){strLength=0;pStr=new char[1];*pStr='\0';}MyString(const char*pString){strLength=strlen(pString);pStr=new char[strLength+1];strcpy(pStr,pString);}MyString(char ch,int n){strLength=n;pStr=new char[strLength+1];for(unsigned int i=0;i<strLength;*(pStr+i++)=ch);*(pStr+strLength)='\0';}MyString(int number){char buffer[20];int temp=number;if(number<0)number=-number;int len=0;do{buffer[len++]=static_cast<char>('0'+number%10 );number/=10;}while(number>0);if(temp<0)buffer[len++]='-';buffer[len]='\0';strLength=len;pStr=new char[strLength+1];strcpy(pStr,buffer);char ch=0;for(int i=0,j=len-1;i<j;i++,j--){ch=pStr[i];pStr[i]=pStr[j];pStr[j]=ch;}}MyString(const MyString&rString){strLength=rString.strLength;pStr=new char[strLength+1];strcpy(pStr,rString.pStr);}~MyString(){delete[]pStr;}MyString& operator+(const MyString&rStr)const {return MyString(*this)+=rStr;}};2.#include<iostream>class MyString{public:MyString(){strLength=0;pStr=new char[1];*pStr='\0';}MyString(const char*pString){strLength=strlen(pString);pStr=new char[strLength+1];strcpy(pStr,pString);}MyString(char ch,int n){strLength=n;pStr=new char[strLength+1];for(unsigned int i=0;i<strLength;*(pStr+i++)=ch);*(pStr+strLength)='\0';}MyString(int number){char buffer[20];int temp=number;if(number<0)number=-number;int len=0;do{buffer[len++]=static_cast<char>('0'+number%10 );number/=10;}while(number>0);if(temp<0)buffer[len++]='-';buffer[len]='\0';strLength=len;pStr=new char[strLength+1];strcpy(pStr,buffer);char ch=0;for(int i=0,j=len-1;i<j;i++,j--){ch=pStr[i];pStr[i]=pStr[j];pStr[j]=ch;}}MyString(const MyString&rString){strLength=rString.strLength;pStr=new char[strLength+1];strcpy(pStr,rString.pStr);}~MyString(){delete[]pStr;}MyString& Operator=(const MyString&rStr)const{if(this == &rStr)return *this;delete []str;str = new char[strlen(rStr.str )+1];strcpy(str, rStr.str);return *this;}};。
国家二级C++机试(运算符重载)模拟试卷5(题后含答案及解析)
国家二级C++机试(运算符重载)模拟试卷5(题后含答案及解析) 题型有:1. 选择题选择题1.运算符重载是对已有的运算符赋予多重含义,因此( )。
A.可以对基本类型(如int类型)的数据,重新定义“+”运算符的含义B.可以改变一个已有运算符的优先级和操作数个数C.只能重载C++中已经有的运算符,不能定义新运算符D.C++中已经有的所有运算符都可以重载正确答案:C解析:此题考查的是运算符重载。
运算符重载是针对C++语言原有的运算符进行的,并不能创造新的运算符。
知识模块:运算符重载2.关于运算符重载,下列表述中正确的是( )。
A.C++已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需要声明返回类型D.可以通过运算符重载来创建C++中原来没有的运算符正确答案:C解析:此题考查的是运算符重载的概念。
C++语言规定,“,”、“*”、“—>.”、“∷”和“?:”这五个运算符不能被重载,故选项A错误;运算符函数的返回类型由该运算符所组成的表达式的值的类型来决定,故选项B说法是错误的;运算符重载是针对原有运算符,并不能通过重载创造出新的运算符,故选项D 错误。
知识模块:运算符重载3.通过运算符重载,可以改变运算符原有的( )。
A.操作数类型B.操作数个数C.优先级D.结合性正确答案:A解析:此题考查的是运算符重载。
运算符重载具有保持其原有的操作数个数、优先级、语法结构和结合性不变的特性。
故本题选项A正确。
知识模块:运算符重载4.下列运算符中,不能被重载的是( )。
A.&&B.!=C..D.++正确答案:C解析:此题考查的是运算符重载。
在C++中,只有.、.*、—>*、∷、?:这五个运算符不能重载。
知识模块:运算符重载5.下列关于运算符重载的描述中,正确的是( )。
A.运算符重载为成员函数时,若参数表中无参数,重载的是一元运算符B.—元运算符只能作为成员函数重载C.二元运算符重载为非成员函数时,参数表中有一个参数D.C++中可以重载所有的运算符正确答案:A解析:此题考查的是运算符的重载。
C++Primer 第14章-重载操作符与转换-课后习题答案
第十四章重载操作符与转换1。
在什么情况下重载操作符与内置操作符不同?在什么情况下重载操作符与内置操作符相同?重载操作符必须具有至少一个类类型或枚举类型的操作数。
重载操作符不保证操作数的求值顺序,例如对&& 和|| 的重载版本不再具有“短路求值”的特性,两个操作数都要进行求值,而且不规定操作数的求值顺序。
对于优先级和结合性及操作数的数目都不变。
2。
为Sales_item编写输入、输出。
加以及复合赋值操作符的重载声明。
class Sales_item{friend std::istream& operator >> ( std::istream&, Sales_item& );friend std::ostream& operator <<(std::ostream&, const Sales_item&);public:Sales_item& operator += ( const Sales_item& );};Sales_item operator+ ( const Sales_item&, const Sales_item& )3。
解释如下程序,假定Sales_item构造函数的参数是一个string,且不为explicit.解释如果构造函数为explicit会怎样。
string null_book = “0-000-00000-0”;Sales_item item(cin);item += null_book;第一句:调用接受一个C风格的字符串形参的string构造函数,创建一个string临时对象,然后使用string复制构造函数用这个临时对象初始化string对象null_book,第二句:从标准输入设备读入数据,创建Sales_item对象item。
第三句:首先调用接受一个string参数的Sales_item构造函数,创建一个临时对象,然后调用Sales_item的复合重载操作符+=,将这个Sales_item临时对象加到item对象上,如果构造函数为explicit,则不能进行从string对象到Sales_item对象的隐式转换,第三句将不能被编译。
国家二级C++机试(运算符重载、模板和C++流)模拟试卷6(题后含答案及解析)
国家二级C++机试(运算符重载、模板和C++流)模拟试卷6(题后含答案及解析)题型有:1. 选择题选择题1.若在表达式y/x中,’’/’’是作为成员函数重载的运算符,则该表达式还可以表示为( )。
A.x.operator/(y)B.operator/(x,y)C.y.operator/(x)D.operator/(y,x)正确答案:C解析:运算符函数的函数名是由运算符前加关键字operator构成的。
所以当“/”作为运算符重载后,其格式为operator/。
所以其作为成员函数调用时的格式为y.operator/(x)。
知识模块:运算符重载2.有类定义如下:class Type{ public:Type(int i=0);Type operator-(int);friend Type operator+(Type,Type);private:int val;};若有对象定义Type c1;则下列语句序列中,错误的是( )。
A.Type(3)+c1;B.e1+Type(3);C.3-c1:D.c1-3;正确答案:C解析:由于在类Type中对“-”进行了重载,所以根据“-”重载的形式定义,c1-3是正确的,而3-c1是错误的表达式。
知识模块:运算符重载3.若要对Data类中重载的加法运算符成员函数进行声明,下列选项中正确的是( )。
A.Data+(Data);B.Data operator+{Data};C.Data+operator{Data};D.operator+(Data,Data);正确答案:B解析:“+”是一个二元运算符,因此作为成员函数重载时参数表中只有一个参数,对应于第二个操作数,而第一个操作数是对象本身。
运算符函数的函数名是由运算符前加关键字operator构成的。
知识模块:运算符重载4.若要对类BigNumber中重载的类型转换运算符long进行声明,下列选项中正确的是( )。
A.operator long( )const;B.operator long(bigNumber);C.long operator long( )const;D.long operator long(BjgNumber);正确答案:A解析:在重载类型转换符时,由于运算符本身已经表示出返回值类型,因此不需要返回值类型的声明。
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.设有以下类定义,其中说明了“+”运算符重载函数的原型。
C运算符重载习题
一、选择题一、下面关于运算符重载的说法中,错误的选项是()。
A、能够对C++所有运算符进行重载B、运算符重载维持固有的结合性和优先级顺序C、运算符重载不能改变操作数的个数D、在运算符函数中,不能利用缺省的参数值二、以下运算符能被重载的是()。
A、::B、?:C、.D、%3、以下表达正确的选项是()。
A、运算符重载函数只能是一个成员函数B、运算符重载函数既能够是一个成员函数,也能够是友元函数C、运算符重载函数只能是一个非成员函数D、运算符重载函数只能是友元函数4、以下表达不正确的选项是()。
A、利用成员函数重载二元运算符时,参数表中的参数必需为两个B、利用成员函数重载二元运算符时,成员函数的this指针所指向的对象作为运算符的左操作数C、利用成员函数重载二元运算符时,参数表中的参数作为此运算符的右操作数D、运算符重载时不能改变运算符的语法结构五、为了区分一元运算符的前缀和后缀运算,在后缀运算符进行重载时,额外添加一个参数,其类型是()。
A、voidB、charC、intD、float六、以下能正确重载运算符的友元函数原型是()。
A、friend B operator?: ( );B、friend B operator+(int x);C、friend B operator+(B b);D、friend B operator+(B b, B a);7、以下表达正确的选项是()。
class B{ int a,b;public:B(int aa=0, int bb=0) { a=aa; b=bb; }B operator+ ( int x ) //A { B r;=a+x;=b+x;return r;}};void main( ){ B x(3,5), y(8,4), z1, z2;z1=x+5;z2=10+y; //B}A、A行有错误B、B行有错误C、A行和B行都有错误D、A行和B行都没有错误八、以下表达正确的选项是()。
类和对象与运算符重载-答案
类和对象与运算符重载-答案选择题1、若有以下说明,在类外使用对象objx成员的正确语句是()。
class X{ int a;void fun1();public:void fun2();};A objx.a=0B objx.fun1();C objx.fun2();D X::fun1();2、若有以下说明,对n的正确访问语句是()。
class Y{ //………;public:static int n;};int Y::n=0;Y objy;A n=1;B Y::n=1;C objy::n=1;D Y->n=1;3、若有以下类Z的说明,函数fstatic的正确定义是()。
class Z{ int a;public:void fstatic(Z &)static;};A void Z::fstatic(Z &objz){objz.a=0;}B void Z::fs tatic(Z &objz){a=objz.a;}C void Z::fstatic(Z &objz){a=0;}D void Z::fstatic(Z &objz){Z::a=0;}4、若有以下类T的说明,函数ffriend的错误定义是()。
class T{ int i;friend void ffriend(T &,int);};A void ffriend(T &objt,int k){objt.i=k;}B void ffriend(T &objt,int k){k=objt.i;}C void T::ffriend(T &objt,int k){K+=objt.i;}D void ffriend(T &objt,int k){objt.i+=k;}5、在类定义的外部,可以被访问的成员有()。
A 所有类成员B 私有或保护类成员C公有的类成员 D 公有或私有的类成员6、关于this指针的说法正确的是()。
C程序设计与应用基础第三章重载习题答案
public:
Polynomial();
Polynomial operator+(const Polynomial&)const;
Polynomial operator-(const Polynomial&)const;
Polynomial operator*(const Polynomial&);
friend Three_d operator + (Three_d& t1,Three_d& t2);
private:
int x,y,z;
};
Three_d operator +(Three_d& t1,Three_d& t2)
{
return Three_d(t1.x+t2.x,t1.y+t2.y,t1.z+t2.z);
第三章重载
1、请完成下列填空题
1)在C++中,只能重载为类的成员函数的运算符是_=_、__[]__、__()__、__->__。
2)利用成员函数对二元运算符重载,其左操作数为___This___,右操作数为___成员函数参数___。
3)单目运算符作为类成员函数重载时___没有___的参数;双目运算符作为___类成员函数___重载时需声明其右操作数,作为___友元函数___重载时需声明全部操作数。
}
2)给th类:
class Three-d
{
public:
Three_d(int I,int j,int k){x=I;y=j;z=k;}.
Three_d()){x=0;y=0;z=0;}
Void Get(int &I,int &j,int &k({I=x;j=y;k=z;}
习题10-运算符重载与多态性
习题10 运算符重载与多态性一、单项选择题1、下列运算符中,()运算符在C++中不能重载。
A、? :B、[ ]C、newD、&&2、下列运算符不能用友元函数重载的是()。
A、+B、=C、*D、<<3、在一个类中可以对一个操作符进行()重载。
A、1种B、2种以下C、3种以下D、多种4、友元运算符obj1>obj2被C++编译器解释为()。
A、operator > (obj1, obj2)B、> (obj1, obj2)C、obj2.operator > (obj1)D、obj1.operator > (obj2)5、下列关于C++运算符函数的返回类型的描述中,错误的是()。
A、可以是类类型B、可以是int类型C、可以是void类型D、可以是float类型6、下列关于运算符重载的描述中,正确的是()。
A、运算符重载可以改变运算符的操作数的个数B、运算符重载可以改变优先级C、运算符重载可以改变结合性D、运算符重载不可以改变语法结构7、下列关于动态联编的描述中,错误的是()。
A、动态联编是以虚函数为基础的B、动态联编是在运行时确定所调用的函数代码的C、动态联编调用函数操作是指向对象的指针或对象引用D、动态联编是在编译时确定操作函数的8、关于虚函数的描述中,正确的是()。
A、虚函数是一个静态成员函数B、虚函数是一个非成员函数C、虚函数既可以在函数说明时定义,也可以在函数实现时定义D、派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型9、对虚函数的调用()。
A、一定使用动态联编B、必须使用动态联编C、一定使用静态联编D、不一定使用动态联编10、编译时的多态性可以通过使用()获得。
A、虚函数和指针B、重载函数和析构函数C、虚函数和对象D、虚函数和引用11、实现运行时的多态性要使用()。
A、重载函数B、构造函数C、析构函数D、虚函数12、要实现动态联编,必须通过()调用虚函数。
国家二级C++机试(运算符重载、模板和C++流)模拟试卷7(题后含答案及解析)
国家二级C++机试(运算符重载、模板和C++流)模拟试卷7(题后含答案及解析)题型有:1. 选择题选择题1.下列关于函数模板的描述中,正确的是( )。
A.函数模板是一个实例函数B.使用函数模板定义的函数没有返回类型C.函数模板的类型参数与函数的参数相同D.通过使用不同的类型参数,可以从函数模板得到不同的实例函数正确答案:D解析:函数模板是一系列相关函数的模型或样板,这些函数的源代码相同,只是所针对的数据类型不同。
数据类型成了函数模板的参数,所以函数模板是一种参数化类型的函数。
知识模块:模板2.有如下函数模板定义:template<typename T1,Typename T2>T1 Fun(T2 n){ return n*5.0;} 若要求以int型数据9作为函数实参调用该模板,并返回一个double型数据,则该调用应表示为( )。
A.FUN(9)B.FUN<9>C.FUN<double>[9]D.FUN<9>(double)正确答案:C解析:根据函数模板的定义,在选项C的调用中,把double类型传递给T1,int型传递给T2。
知识模块:模板3.下列关于模板的描述中,错误的是( )。
A.类模板的成员函数都是模板函数B.函数模板是一种参数化类型的函数C.满足一定条件时可以省略模板实参D.模板形参只能由关键字typename声明正确答案:D解析:同一模板的声明和定义中,模板形参的名字不必相同。
每个模板类型形参前面必须带上关键字typename/class,每个非类型形参前面必须带上类型名字。
知识模块:模板4.已知主函数中通过如下语句序列实现对函数模板swap的调用:inta[10],b[10];swap(a,b,10);下列对函数模板swap的声明中,会导致上述语句序列发生编译错误的是( )。
A.template<typename T>void swap(T a[],T b[],int size);B.template<typename T>void swap(int size,T a[],T b[]);C.template<typename T1,typename T2>void swap(T1 a[],T2 b[],int size};D.template<class T1,class T2>void swap(T1 a[],T2 b[],int size);正确答案:B解析:由题目中函数swap(a,b,10)调用语句可知,在对函数模板swap的声明语句中,应将第一、二个参数设为数组变量,第三个参数为整型变量。
c++运算符重载习题
c++运算符重载习题Task8-1/*1. 定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。
将运算符函数重载为非成员、非友元的普通函数。
编写程序,求两个复数之和*/#include<iostream>using namespace std;class Complex{public:Complex(){real=0;imag=0;}Complex(double r,double i){real=r;imag=i;}void display();double real;double imag;};void Complex::display(){cout<<"("<<real<<","<<imag<<"i)";}Complex operator +(Complex &c1,Complex &c2){Complex p;p.real=c1.real+c2.real;p.imag=c1.imag+c2.imag;return p;}int main(){Complex c1(3,5),c2(2,5),c3;c1.display();cout<<"+";c2.display();cout<<"=";c3=c1+c2;c3.display();}Task8-2/*2. 定义一个复数类Complex,重载运算符“+”、”-“、”*”、”/”,使之能用于复数的加、减、乘、除。
运算符重载函数作为Complex类的成员函数,编程,分别求两个复数之和差积商。
*/#include<iostream>using namespace std;class Complex{public:Complex(){real=0;imag=0;}Complex(double r,double i){real=r;imag=i;}Complex operator+(Complex &c2);Complex operator-(Complex &c2);Complex operator*(Complex &c2);Complex operator/(Complex &c2);void display();private:double real;double imag;};Complex Complex::operator +(Complex &c2){Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;}Complex Complex::operator -(Complex &c2){Complex c;c.real=real-c2.real;c.imag=imag-c2.imag;return c;}Complex Complex::operator *(Complex &c2){Complex c;c.real=real*c2.real;c.imag=imag*c2.imag;return c;}Complex Complex::operator /(Complex &c2){Complex c;c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); return c;}void Complex::display(){cout<<"("<<real<<","<<imag<<"i)"<<endl;}int main(){Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;cout<<"c1+c2=";c3.display();c3=c1-c2;cout<<"c1-c2=";c3.display();c3=c1*c2;cout<<"c1*c2=";c3.display();c3=c1/c2;cout<<"c1/c2=";c3.display();return 0;}Task8-3/*3. 有两个矩阵a和b,均为n行m列(m、n的值自己给出),求两个矩阵之和、差、积、商,重载运算符“+”、”-“、”*”、”/”,使之能用于矩阵向加减乘除,如c=a+b、 c=a*b。
课本答案
cout << d << endl; // 输出日期
system("PAUSE"); // 调用库函数system( ),输出系统提示信息
return 0; // 返回值, 返回操作系统
}
*3.设计一个时间类Time,要求:
using namespace std; // 使用命名空间std
// 声明复数类
class Complex
{
private:
// 数据成员
double real; // 实部
double image; // 虚部
……
1.定义一个复数类Complex,重载运算符“+”,“-”,“*”,使之能用于复数的加、减、乘。编程序,分别求两个复数之和、差与积。
……
int main() // 主函数main()
{
Complex z1(2, 3), z2(6, -5), z3; // 定义复数对象
z1.Show(); // 输出z1
z2.Show(); // 输出z2
z3 =z1 + z2; // z3=z1+z2
答案:B
填空题
1.若以非成员函数形式为类MyClass重载“!”运算符,其操作结果为一个bool型数,则该运算符重载函数的原型是 。
解析:以非成员函数形式重载一元运算符“!”,一定含有一个参数,此处为类MyClass的常引用。
答案:bool operator!( const MyClass &);
(1)包含时(hour)、分(minute)和秒(second)私有数据成员。
习题二C++练习(含有答案)
A.?:B. +C. -D. <=
7.在一个类中可以对一个操作符进行(D)重载。
A. 1种B. 2种以下C. 3种以下D.多种
8.若类A被说明成类B的友元,则(D)。
A.类A的成员即类B的成员B.类B的成员即类A的成员
C.类A的成员函数不能访问类B的成员D.类B不一定是类A的友元
friend class B;
};
class B
{
A *top;
public:
B(){top=0;}
void push(int i){A *n=new A(i,top);top=n;}
int pop()
{
A *t=top;
if(top)
{
top=top->prev;
int c=t->data;
delete t;
9.友元的作用是(A)。
A.提高成员的运行效率B.加强类的封装性
C.实现数据的隐藏性D.增加成员函数的种类
10.下列关于静态数据成员的特性描述中错误的是(D)。
A.说明静态数据成员时前边要加staticB.静态数据成员要在类体外进行初始化
C.引用静态数据成员时,要在静态数据成员名前加“类名”和作用域运算符
{
A z(3,6), f;
A::f();
}
A::f();
}
答案:
c=5
c=3
5. #include <iostream>
using namespace std;
class point
{
public:
void poi(int px=10,int pd int getpx(point a);
《C++程序设计教程 第2版》教学素材习题13答案
习题13答案一、简答题1.什么是运算符重载?实现运算符重载有几种方法?如何实现?答案:运算符重载机制能够实现将已有运算符应用到新的数据类型上,赋予运算符新的含义。
C++对运算符重载有一些限制,见13.2.1节。
有两种方法可以实现运算符重载,它们是:类的成员函数实现方式和友元函数实现方式。
定义友元的目的是在友元函数中直接访问类的私有成员。
实际上,可以通过类的公有函数接口访问类的私有成员,所以对于运算符重载,可以使用非成员、非友元函数实现。
但是这种实现方法增加了访问私有数据成员的公有函数的调用时间,不值得提倡。
见13.2.2节。
2.如何实现本类对象与其它类对象之间的相互类型转换?答案:使用运算符重载中的“类型转换函数”将本类对象转换成其他类对象。
使用“构造函数”将其他类对象转换成本类对象。
3.什么是虚函数?什么是纯虚函数?它们的作用是什么?答案:多态性是面向对象程序设计的重要特性,它与封装性和继承性构成面向对象程序设计的三大特性。
这三大特性是互相关联的,封装性是基础,继承性是关键,而多态性是补充。
多态分为静态多态和动态多态。
函数重载和运算符重载属于静态多态。
静态多态也称为编译时多态。
而动态多态是运行时的多态,如某些函数的调用关系在运行阶段才能确定。
为了实现函数调用关系的动态多态,可以将函数定义成虚函数。
将一个成员函数定义成虚函数的方法是,在函数定义的返回值类型前加关键字virtual。
在抽象类中,有时无法实现某一功能(即无法给出某一函数的具体实现),可以将实现该功能的函数定义成纯虚函数。
虚函数具有函数实现的函数体,而纯虚函数一般没有函数体,即没有函数实现。
对纯虚函数,一般只能在其派生类中实现该函数的功能。
4.试比较虚函数与虚基类的概念及作用。
答案:虚函数用于实现动态多态。
虚基类用于实现在多重继承情况下基类同名成员在派生类中的访问二义性问题。
如果基类是虚基类,则同名数据成员在派生类中只保留一个副本,见12.6节。
国家二级C++机试(运算符重载)模拟试卷6(题后含答案及解析)_0
国家二级C++机试(运算符重载)模拟试卷6(题后含答案及解析) 题型有:1. 选择题选择题1.有如下程序:#inc1ude<iostream>Using namespace std; Class Amount{ int amount; public; Amount(int n=0): amount(n){} Int getAmount( )const {retum amount;} Amount &operator+=(Amount a){ amount+=a.amount; retum ; } };int main( ){ Amount x(3),y(7);x+=y;cout<<x.getAmount( )<<end1; retum 0;} 已知程序的运行结果是10,则下划线处缺失的表达式是( )。
A.*thisB.thisC.&amountD.amount正确答案:A解析:此题考查的是“+”运算符重载和this指针。
语句amount+=a.amount;实现3和7的求和得到amount=10,要使程序的输出结果为10,又因为函数的返回值类型为Amount&,所以横线处填入*this。
知识模块:运算符重载2.如果表达式a>=b中的“>=”是作为非成员函数重载的运算符,则可以等效地表示为( )。
A.a.operator>=(b)B.b.operatotr>=(a)C.operator>=(a,b)D.operator>=(b,a)正确答案:C解析:运算符函数作为非成员函数时,没有隐含的this指针,因此所有的操作数必须出现在参数表中,对于二元运算符,参数表中有两个参数,分别代表第一操作数和第二操作数,且顺序不能改变。
知识模块:运算符重载3.已知表达式++a中的“++”是作为成员函数重载的运算符,则与++a等效的运算符函数调用形式为( )。
A.a.operator++(1)B.operator++(a)C.operator++(a,1)D.a.operator++( )正确答案:C解析:本题主要是对运算符霞载的考查。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int vec[10]; public: Vector(int v[10]); Vector(); Vector(Vector&); Vector operator+(Vector&); Vector operator-(Vector&); friend ostream& operator<<(ostream& out, Vector&); }; Vector::Vector(int v[10]){ int i; for(i=0;i<10;i++)vec[i]=v[i]; } Vector::Vector(){ int i; for(i=0;i<10;i++)vec[i]=0; } Vector::Vector(Vector& v){ int i; for(i=0;i<10;i++)vec[i]=v.vec[i]; } Vector Vector::operator+(Vector& v){ Vector z; int i; for(i=0;i<10;i++) z.vec[i]=vec[i]+v.vec[i]; return z; } Vector Vector::operator-(Vector& v){ Vector z; int i; for(i=0;i<10;i++) z.vec[i]=vec[i]-v.vec[i]; return z; } ostream& operator<<(ostream& out, Vector& v){ for(int i=0;i<10;i++) out<<v.vec[i]<<","; return out; } void T( ){a=0; b=0; c=0;} T( int i,int j,int k) {a=i; b =j;c=k;} void get( int &i,int &j,int &k) {i=a; j=b; k=c;} T operator *(T obj); private: int a,b,c; }; T T::operator *(T obj) {T tempobj; tempobj.a=a * obj.a; tempobj.b=b * obj.b; tempobj.c=c * obj.c; return tempobj; } int main() {T obj1( 1,2,3),obj2( 5,5,5),obj3; int a,b,c; obj3=obj1 * obj2; obj3.get( a, b, c); cout<<”(obj1 * obj2):\t” <<”a=”<<a<<’\t’<<“b=”<<b<< '\t'<<”c=”<<c<<’\t’<<endl; (obj2 * obj3 ).get( a, b, c); cout<<“(obj2*obj3):\t” <<“a=”<<a<<'\t'<<”b=”<<b<<’\t’<<“c=”<<c<<'\t’<<endl; } (obj1*obj2): a=5 b=10 c=15 (obj2*obj3): a=25 b=50 c=75 5.编程题 5.1 将第 4 章练习 5.7 的分数类 Fraction 的算术运算改写成运算符重载函数,使分数类能 实现通常的分数+、-、*、/等运算。 #include <iostream> using namespace std; class Fraction{ int numerator,denominator; int common_divisor(); //计算最大公约数 void contracted(); //分数化简 public: Fraction(int=0,int=1); Fraction(Fraction&); Fraction operator+(Fraction);
int a[10]={-4,1,0,10,5,-9,8,13,6,2,}; int b[10]={-11,8,10,17,-6,9,6,7,12,5}; Vector v1(a),v2(b),v3,v4; v3=v1+v2; v4=v2-v1; cout<<v3<<endl; cout<<v4<<endl; } 5.3 定义一个类 nauticalmile_kilometer,它包含两个数据成员 kilometer(km)和 meter(m)。 还包含一个构造函数对数据成员的初始化;成员函数 print 用于输出数据成员 kilometer 和 meter 的值;类型转换函数 double()实现把千米和米转换为海里(1mile=1852m)。编写 main 函数,测试类 nauticalmile_kilometer。 #include <iostream> using namespace std; class nauticalmile_kilometer{ int kilometer,meter; public: nauticalmile_kilometer(int =0,int =0); operator double(); void print(){ cout<<kilometer<<","<<meter; } }; nauticalmile_kilometer::operator double(){ return kilometer*meter/1852.0; } nauticalmile_kilometer::nauticalmile_kilometer(int k,int m){ kilometer=k; meter=m; } void main(){ nauticalmile_kilometer km(3,657); double d=km; cout<<d<<endl; }
Fraction operator-(Fraction); Fraction operator*(Fraction); Fraction operator/(Fraction); void Set(int=0,int=1); void disp(){cout<<"fraction= "<<numerator<<"/"<<denominator<<endl;} }; Fraction::Fraction(int num,int deno){ Set(num, deno); } Fraction::Fraction(Fraction& f){ numerator=f.numerator; denominator=f.denominator; } Fraction Fraction::operator+(Fraction f){ Fraction Temp(numerator*f.denominator+f.numerator*denominator,denominator*f.denominator) ; Temp.contracted(); return Temp; } Fraction Fraction::operator-(Fraction f){ Fraction Temp(numerator*f.denominator-f.numerator*denominator,denominator*f.denominator) ; Temp.contracted(); return Temp; } Fraction Fraction::operator*(Fraction f){ Fraction Temp(numerator*f.numerator,denominator*f.denominator); Temp.contracted(); return Temp; } Fraction Fraction::operator/(Fraction f){ Fraction Temp(f.denominator,f.numerator ); Temp=operator*(Temp); Temp.contracted(); return Temp; }