};
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;
}
int Fraction::common_divisor(){
int residue;
int dividend=numerator,divisor=denominator;
while(residue=dividend%divisor){
dividend=divisor;
divisor=residue;
}
return divisor;
}
void Fraction::contracted()
{
int residue=common_divisor();
numerator/=residue;
denominator/=residue;
if(denominator<0){numerator*=-1;denominator*=-1;}
}
void Fraction::Set(int num,int deno){
if(deno!=0){
numerator=num;denominator=deno;
contracted();
}
}
void main(){
Fraction f1(1,3),f2(2,5),f3,f4,f5(2,8),f6,f7(8,3),f8(8,3),f9(1,4);
f4=f1+f2;
f4.disp();
f6=f2/f5/f7;
f6.disp();
f5.disp();
f6=f1-f2;
f6.disp();
}
5.2设向量X=(x1,x2,…,x n)和Y=(y1,y2…,y n),它们之间的加、减分别定义为: X+Y=(x1+y1,x2+y2,…,x n+y n)
X-Y=(x1-y1,x2-y2,…,x n-y n)
编程序定义向量类Vector ,重载运算符”+”、”-“、”=”,实现向量之间的加、减和赋值运算;用重载运算符”>>”、”<<”做向量的输入/输出操作。注意检测运算的合法性。#include
//using namespace std;
class Vector{
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<return out;
}
void main(){
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<cout<}
5.3定义一个类nauticalmile_kilometer,它包含两个数据成员kilometer(km)和meter(m)。还包含一个构造函数对数据成员的初始化;成员函数print用于输出数据成员kilometer和meter的值;类型转换函数double()实现把千米和米转换为海里(1mile=1852m)。编写main 函数,测试类nauticalmile_kilometer。
#include
using namespace std;
class nauticalmile_kilometer{
int kilometer,meter;
public:
nauticalmile_kilometer(int =0,int =0);
operator double();
void print(){
cout<}
};
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<第十章 运算符重载 复习题
运算符重载复习题 1. 重载赋值操作符时,应声明为( ) A. 友元函数 B. 虚函数 C. 成员函数 D. 多态函数 2.关于重载的描述,正确的是( ) A.函数重载只能在成员函数之间进行 B.函数重载只能在全局函数之间进行 C.函数重载可以在基类和派生类之间进行 D.函数重载必须要求同名的函数的形参类型和个数都完全一致,返回值类型无所谓 3.下列运算符中不能重载的是( )。 A.∷(域运算符) B.+ (正) C.++ (自增) D.*(指针) 4. 派生类的对象对它的基类成员中() A. 公有继承的公有成员是可以访问的 B. 公有继承的私有成员是可以访问的 C. 公有继承的保护成员是可以访问的 D. 私有继承的公有成员是可以访问的 5 不能重载的运算符是() A. ?: B. [ ] C. new D. && 6. C++中不能重载的运算符是( ) A. new B. += C. sizeof D. && 7.重载函数是( ) A.以函数参数来区分,而不用函数的返回值来区分不同的函数 B.以函数的返回值来区分,而不用函数参数来区分不同的函数 C.参数表完全相同而返回值类型不同的两个或多个同名函数 D.参数表和返回值类型中至少有一个不同的两个或多个同名函数 8.对于运算符重载,说法正确的是( ) A.运算符如果被重载为非成员函数,那么对象就不能利用这个运算符重载函数进行操作 B.运算符重载函数可能既不是成员函数,也不是友元函数 C.用户每定义一个类,系统会自动提供一个赋值运算符重载函数,所以完全不 必考虑重载赋值运算符函数 D.一个类的虚函数不能调用运算符重载函数 9. C++中不能重载的运算符是( )
第7章 运算符重载-习题
《面向对象程序设计》习题 班级:学号:姓名:名单序号:成绩: 第7章运算符重载和多态性 一、选择题(共30分,每题1分) 1.下列运算符中,()运算符在C++中不能重载。 A.?: B.[] C. new D.++ 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. 下列运算符中哪些是不能够被重载的()。 A. .,.*,sizeof,::,?: B. ++,--,new,= = C. new,delete,>=,[ ] D. +,-,=,delete 10. 在名为BigNumber类的类体中对运算符函数double进行如下声明: operator double(BigNumbe); 函数声明中有一个明显的错误,这个错误就是()。 A.参数表中不应该有任何参数 B.缺少对函数返回类型的说明 C.参数声明中缺少参数变量 D.函数声明中缺少函数体 11. 下列关于运算符重载的描述中,正确的是()。
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 : :
第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); }; 答案:D 7. 在第33题中,当执行语句d+=m; 时,C++编译器对语句作如下解释: (34) A. d=operator+=(m); B. m=operator+=(d); C. d.operator+=(m); D. m.operator+=(d); 答案:C 8. 设有以下类定义,其中说明了“+”运算符重载函数的原型。这是一个友元函数,当类
C++程序设计运算符重载习题
选择题 1.在下列运算符中,能重载的是( )。 (a) ! (b) sizeof (c) new (d) delete 2.在下列运算符中,不能重载的是( )。 (a) <= (b) >> (c) ::(d) &= 3.下列关于运算符重载的描述中,( )是正确的。 (a) 可以改变参与运算的操作数个数(b) 可以改变运算符原来的优先级 (c) 可以改变运算符原来的结合性(d) 不能改变原运算符的语义 4.下列函数中,能重载运算符的函数是( )。 (a) 成员函数(b) 构造函数(c) 析构函数(d) 友员函数 5.不能用友员函数重载的是( )。 (a) = (b) = = (c) += (d) != 6.下面描述中,错误的是( )。 (a) 只有系统预先定义的运算符才可能被重载 (b) 使用类型转换函数不能把一个类转换为另一个类 (c) 使用类型转换函数可以把类转换为基本类型 (d) 类型转换函数只能定义为一个类的成员函数,不能定义为类的友员函数 1、a,c,d 2、c 3、d 4、b,c 5、a 6、b 阅读下列程序,写出执行结果 1.#include〈iostream.h〉 class T { public : 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; } void main( ) { T obj1( 1,2,3 ), obj2( 5,5,5 ), obj3; int a , b , c;
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. sizeof C. new D. delete 3.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 )。 A.operator+有两个参数,operator*有两个参数 B.operator+有两个参数,operator*有一个参数 C.operator+有一个参数,operator*有两个参数 D.operator+有一个参数,operator*有一个参数 4.写出下列程序运行结果 4.1#include #using namesoace std;
第8章运算符重载
第八章操作符重载 重载是C++多态性的体现之一。当定义新的数据类型之后,C++原有操作符提供的操作 在语义往往不能满足对新的数据类型的对象进行操作,因此必须对C++原有操作符的操作语 义进行扩充,这就是重载的应用需求背景。 8.1操作符重载概述 当在同一作用域内声明两个或多个相同的名字(即标识符)时,称该名字被重载。在同一作用域内的两个声明,如果声明的名字相同但是数据类型不同,则称这两个声明为重载声明。C++规定,只有函数声明可以被重载,对象声明或类型声明不允许重载。换言之, C++的这一规定将重载严格限制在函数范畴。 当重载的函数被调用时,从诸个可调用的重载函数( viable fu nctio ns )中究竟调用 那一个函数则由调用时实参的类型与函数声明时形参的类型相比较结果的一致性决定。这个选择与决定的过程称为重载解析。在C++中,根据函数的定义者是谁可以将函数分为两类。 一类是由程序员定义的函数,它们往往被称为用户自定义函数,另一类则是系统提供的函 数。就系统提供的函数而言,根据它们的调用方式,又可以进一步分为两类。一类是与用 户自定义函数调用方式相同的系统函数,它们往往称为库函数或类库中的成员函数;另一 类则沿用自然语言和数学语言的使用习惯,在各类表达式中完成相应的运算,它们往往称为操作符或运算符,但实际上是系统的预定义函数或操作符函数。例如对整型对象x、y,x+y 实际表示对预定义函数’+'的调用。x和y是预定义函数’+'的参数,但一般习惯上称为 ‘ + '的左操作数和右操作数。由于操作符实际上也是函数,不同的只在于操作符是系统的 预定义函数,因此操作符和用户自定义函数一样也可以重载。 以加法操作‘ +'为例,C++提供的‘ +'操作如果不考虑类库支持,则只能进行整数或实数的加法运算,若考虑类库支持则能够进行一般复数的运算。如果用复数来表示电路中的电流和电压,根据电路理论,只有电流和电流才能进行相加减的运算;同理,只有电压 和电压才能进行相加减的运算。因此,为了将复数用于电路计算,可以象下面的例子那样 设计一个用于电路计算的复数类,并且对加法操作的语义进行扩充。例8-1设计一个能够用于电路计算的复数类,并重载加法操作。 #i nclude "iostream.h" struct complex { complex(double re=0.0,double im=0.0,char ch1='U'); complex operator+(complex & c);〃声明重载加法操作 void show(); private: double real,imag; char ch; }; complex::complex(double re,double im,char ch1 ) { real=re;imag=im;ch=ch1; cout<<"c on structor is called!"<