实验12 运算符重载(2)
牛旭艳智能二班 20110807201
一、实验目的
1、进一步理解运算符重载,运用成员函数和友元函数等方法实现运算符的重载。
二、实验内容
1、重载函数调用运算符(),将以下的二维数组的下标表示方法:
chessBoard[row][column]改为常用的表示方法:
chessBoard(row,column)
2、重载下标运算符使之返回集合中最大的元素、次最大的元素以及第三大的元素。
3、开发多项式类Polynomial,多项式的每一项用数组表示,每项包含一个系数和一个指数。例如:2x4的指数为4,系数为2。
请开发一个完整的Polynomial类,包括构造函数、析构函数以及"get"函数和"set"函数。该类还要提供下述重载的运算符(分别使用成员函数和友元函数):
1)重载加法运算符+,将两个多项式相加;
2)重载减法运算符-,将两个多项式相减;
3)重载赋值运算符=,将一个多项式赋给另外一个多项式;
4)重载乘法算符*,将两个多项式相乘;
5)重载加法赋值运算符+=、减法赋值运算符-=以及乘法赋值运算符*=。
4.设计一个日期类Date,,要求:
(1)包含年(year)、月(month)和日(day)私有数据成员。
(2)包含构造函数,重载关于一日期加上天数的加法运算符+、重载关于一日期减去天数的减加运算符-、重载输出运算符<<与输入运算符>>等。
提示:由于各C++编译器对于重载输入/出运算符为友元的兼容性都存在问题,最好重载输入/出运算符不声明为成员函数与友元函数,而声明一般函数,为编程更方便,可增加一些成员函数,比如:
void SetYear(int y); // 设置年
int SetMonth(int m); // 设置月
int SetDay(int d); // 设置日
int GetYear() const; // 返回年
int GetMonth() const; // 返回月
int GetDay() const; // 返回日
static int IsLeapyear(int y); // 判断年份y是否为润年
static int GetDays(int y); // 年份y的天数
static int GetDays(const Date &d); // 日期d当前月份的天数
static int DateToNum(const Date &d); // 返回从公元1年1月1日起的天数
static Date NumToDate(int n); //由从公元1年1月1日起的天数返回日期
润年条件:年份能被4整除,并且年份不能被100整除,或者年份能被400整除
润年天数:366
平年天数:365
润年2月份天数:29
平年2月份天数:28
5.设计一个时间类Time,要求:
(1)包含时(hour)、分(minute)和秒(second)私有数据成员。
(2)包含构造函数,重载关于一时间加上另一时间的加法运算符+、重载关于一时间减去另一时间的减加运算符-、重载输出运算符<<与输入运算符>>等。
提示:可仿照第4题编程实现,可将时间转换成秒数,将秒数转成时间进行辅助编程。
时间转换成秒数:
秒数= 时* 3600 + 分* 60 + 秒
秒数转换成时间:
时= 秒数/ 3600
分= (秒数- 时* 3600) / 60
秒= 秒数% 60
为编程更方便,可增加一些成员函数,比如:
void SetHour(int hh); // 设置小时
void SetMinute(int mm); // 设置分钟
void SetSecond(int ss); // 设置秒
int GetHour() const; // 返回小时
int GetMinute() const; // 返回分钟
int GetSecond() const; // 返回秒
三、实验程序及结果
1、
#include
using namespace std;
class chessBoard
{
private:
int a[2][2];
public:
chessBoard(int y,int b,int c,int d)
{
a[0][0]=y;
a[0][1]=b;
a[1][0]=c;
a[1][1]=d;
}
int & operator()(int b,int c);
};
int & chessBoard::operator()(int b,int c) {
return a[b][c];
}
int main()
{
chessBoard v(1,2,3,4);
v(0,1)=v(1,0);
cout< return 0; } 2、 #include class xiabiao { public: xiabiao()//构造函数赋予数组初值 { for(int i = 0;i < 10;i++) if(i>5) jihe[i] =(-1)* 2 * i; else jihe[i] =i + 3; cout<<"所有元素:"< for(i = 9;i >= 0;i--) cout< } int & operator[](int a) { int t; for(int i = 0;i < 10;i++)//冒泡排序大的放前面for(int j = 0;j < 9-i;j++) { if(jihe[j] { t = jihe[j]; jihe[j] = jihe[j+1]; jihe[j+1] = t; } } return jihe[a-1]; } private: int jihe[10]; }; int main() { xiabiao xi; cout<<"最大的为:"< cout<<"第二的为:"< cout<<"第三的为:"< return 0; } 3、 #include #include class Polynomial { public: Polynomial(); Polynomial operator+(const Polynomial&)const; Polynomial operator-(const Polynomial&)const; Polynomial operator*(const Polynomial&); Polynomial& operator+=(const Polynomial&); Polynomial& operator-=(const Polynomial&); Polynomial& operator*=(const Polynomial&); void EnterTerms();//输入函数 void PrintPolynomial( )const;//打印函数 private: int exponents[100]; int coefficients[100]; void polynomialCombine(Polynomial&);//合并同类项}; Polynomial::Polynomial() { for(int i=0;i<100;i++)//置零 { coefficients[i]=0; exponents[i]=0; } } void Polynomial::PrintPolynomial() const//输出函数{ int start;//输出累加系数 bool zero=false; if(coefficients[0])//常数存在 { cout< start=1; zero=true; } else { if(coefficients[1]) { cout< if((exponents[1]!=0)&&(exponents[1]!=1)) cout<<'^'< zero=true; } start=2; } for(int x=start;x<100;x++) //输出其他各项 if(coefficients[x]!=0) { cout< < if((exponents[x]!=0)&&(exponents[x]!=1)) cout<<'^'< zero=true; } if(!zero) //多项式为空 cout<<'0'; cout< } Polynomial Polynomial::operator+(const Polynomial& r) const { Polynomial temp; bool exponentExists; temp.coefficients[0]=coefficients[0]+r.coefficients[0]; //计算常量之和for(int s=1;(s<100)&&(r.exponents[s]!=0);s++) { temp.coefficients[s]=r.coefficients[s]; temp.exponents[s]=r.exponents[s]; } for(int x=1;x<100;x++) //计算其他各项之和 { exponentExists=false; for(int t=1;(t<100)&&(!exponentExists);t++) if(exponents[x]==temp.exponents[t]) { temp.coefficients[t]+=coefficients[x]; exponentExists=true; } if(!exponentExists) { temp.exponents[s]=exponents[x]; temp.coefficients[s]+=coefficients[x]; s++; } } return temp; } Polynomial &Polynomial::operator+=(const Polynomial &r) { *this=*this+r; return *this; } Polynomial Polynomial::operator-(const Polynomial &r)const { Polynomial temp; bool exponentExists; temp.coefficients[0]=coefficients[0]-r.coefficients[0]; for(int s=1;(s<100)&&(exponents[s]!=0);s++) { temp.coefficients[s]=coefficients[s]; temp.exponents[s]=exponents[s]; } for(int x=1;x<100;x++) { exponentExists=false; for(int t=1;(t<100)&&(!exponentExists);t++) if(r.exponents[x]==temp.exponents[t]) { temp.coefficients[t]-=r.coefficients[x]; exponentExists=true; } if(!exponentExists) { temp.exponents[s]=r.exponents[x]; temp.coefficients[s]-=r.coefficients[x]; s++; } } return temp; } Polynomial &Polynomial::operator-=(const Polynomial& r) { *this=*this-r; return *this; } Polynomial Polynomial::operator*(const Polynomial& r) { Polynomial temp; int s=1; for(int x=0;(x<100)&&(x==0||coefficients[x]!=0);x++) for(int y=0;(y<100)&&(y==0||r.coefficients[y]!=0);y++) if(coefficients[x]*r.coefficients[y]) if((exponents[x]==0)&&(r.exponents[y]==0)) temp.coefficients[0]+=coefficients[x]*r.coefficients[y]; else { temp.coefficients[s]= coefficients[x]*r.coefficients[y]; temp.exponents[s]=exponents[x]+r.exponents[y]; s++; } polynomialCombine(temp); //合并同类项 return temp; } void Polynomial::polynomialCombine(Polynomial& w) { Polynomial temp=w; int exp; for(int x=0;x<100;x++) { w.coefficients[x]=0; w.exponents[x]=0; } for(x=1;x<100;x++) { exp=temp.exponents[x]; for(int y=x+1;y<100;y++) if(exp==temp.exponents[y]) { temp.coefficients[x]+=temp.coefficients[y]; temp.exponents[y]=0; temp.coefficients[y]=0; } } w=temp; } Polynomial &Polynomial::operator*=(const Polynomial& r) { *this=*this*r; return *this; } void Polynomial::EnterTerms()//初始函数 { bool found=false; int numberOfTerms,c,e; cout<<"Enter number of polynomial terms:"; cin>>numberOfTerms; for(int n=1;n<=numberOfTerms;n++) { cout<<"Enter coefficient:";//系数 cin>>c; cout<<"Enter exponent:";//阶数 cin>>e; if(c!=0) { if(e==0)//初始置零 { coefficients[0]+=c;//常数 continue; } for(int term=1;(term<100)&&(coefficients[term]!=0);term++)//找是否阶数相同 if(e==exponents[term]) { coefficients[term]+=c; exponents[term]=e; found=true; } if(!found)//阶数不同另外储存 { coefficients[term]+=c; exponents[term]=e; } } } } void main() { Polynomial a,b,c,t,d; a.EnterTerms(); b.EnterTerms(); cout< a.PrintPolynomial(); cout< b.PrintPolynomial(); cout< c=a+b; c.PrintPolynomial(); cout< t=a; a+=b; a.PrintPolynomial(); cout< a=t; c=a-b; c.PrintPolynomial(); cout< a-=b; a.PrintPolynomial(); cout< a=t; c=a*b; c.PrintPolynomial(); cout< a*=b; a.PrintPolynomial(); cout< } 4、 #include"iostream.h" class Date { public: Date(int a=0,int b=0,int c=0); void Set_Date(int a,int b,int c); void Get_Date(); Date operator+(int); Date operator-(int); friend ostream& operator<<(ostream&, Date&); friend istream& operator>>(istream&, Date&); private: int year,mounth,date,m; }; Date::Date(int a,int b,int c) { year=a; mounth=b; date=c; m=1; } void Date::Set_Date(int a,int b,int c) { year=a; mounth=b; date=c; } void Date::Get_Date() { if(m==1) cout< else cout<<"刚才输入的天数不符合要求!"< } Date Date::operator+(int a) { if(a>28) { m=0; return *this; } else { if((year%400==0)||((year%4==0)&&(year%100!=0))) { if((mounth==4)||(mounth==6)||(mounth==9)||(mounth==11)) { if((date+a)<=30) date=date+a; else { date=date+a-30; mounth++; } } else { if(mounth==2) { if((date+a)<=29) date=date+a; else { date=date+a; mounth++; } } else { if((date+a)<=31) date=date+a; else { date=date+a-31; if(mounth==12) { year++; mounth=1; } else mounth++; } } } } else { if((mounth==4)||(mounth==6)||(mounth==9)||(mounth==11)) { if((date+a)<=30) date=date+a; else { date=date+a-30; mounth++; } } else { if(mounth==2) { if((date+a)<=28) date=date+a; else { date=date+a-28; mounth++; } } else { if((date+a)<=31) date=date+a; else { date=date+a-31; if(mounth==12) { year++; mounth=1; } else mounth++; } } } } return *this; } } Date Date::operator-(int a) { if(a>28) { m=0; return *this; } else { if((year%400==0)||((year%4==0)&&(year%100!=0))) { if((mounth==5)||(mounth==7)||(mounth==10)||(mounth==12)) { if(date>=a) date=date-a; else { date=date-a+30; mounth--; } } else { if(mounth==3) { if(date>=a) date=date-a; else { date=date-a+29; mounth--; } } else { if(date>=a) date=date-a; else { date=date-a+31; if(mounth==1) { year--; mounth=12; } else mounth--; } } } } else { if((mounth==5)||(mounth==7)||(mounth==10)||(mounth==12)) { if(date>=a) date=date-a; else { date=date-a+30; mounth--; } } else { if(mounth==3) { 运算符重载基础概念练习题 1、下列运算符中, ()运算符在C++中不能重载。 A = B () C :: D delete 2、下列运算符中, ()运算符在C++中不能重载。 A ?: B [] C new D && 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++编译器解释为()。 A operator>(obj1,obj2) B >(obj1,obj2) C obj2.operator>(obj1) D obj1.oprator>(obj2) 8、在表达式x+y*z中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是()。 A operator+有两个参数,operator*有两个参数 B operator+有两个参数,operator*有一个参数 C operator+有一个参数,operator*有两个参数 D operator+有一个参数,operator*有一个参数 9、重载赋值操作符时,应声明为()函数。 A 友元 B 虚 C 成员 D 多态 10、在一个类中可以对一个操作符进行()重载。 A 1种 B 2种以下 C 3种以下 D 多种 11、在重载一个运算符时,其参数表中没有任何参数,这表明该运算符是()。 C++习题参考答案 第1章面向对象程序设计概论 一、名词解释 抽象封装消息 【问题解答】 面向对象方法中的抽象是指对具体问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。 面向对象方法中的封装就是把抽象出来的对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。 消息是面向对象程序设计用来描述对象之间通信的机制。一个消息就是一个对象要求另一个对象实施某种制作的一个请求。 二、填空题 (1)目前有面向过程的结构化程序设计方法和面向对象的程序设计方法两种重要的程序设计方法。 (2)结构化程序设计方法中的模块由顺序、选择和循环3种基本结构组成。(3)在结构化程序设计方法中,程序可表示为程序=数据结构+算法。而面向对象的程序设计方法,程序可表示为程序=对象+消息。 (4)结构化程序设计方法中的基本模块是过程。而面向对象程序设计方法中的基本模块是类。 (5)面向对象程序设计方法具有抽象性、封装性、继承性和多态性等特点。 三、选择题(至少选一个,可以多选) (1)面向对象程序设计着重于( B )的设计。 A. 对象 B. 类 C. 算法 D. 数据 (2)面向对象程序设计中,把对象的属性和行为组织在同一个模块内的机制叫做( C )。 A. 抽象 B. 继承 C. 封装 D. 多态 (3)在面向对象程序设计中,类通过( D )与外界发生关系。 A. 对象 B. 类 C. 消息 D. 接口 (4)面向对象程序设计中,对象与对象之间的通信机制是( C )。 A. 对象 B. 类 C. 消息 D. 接口 (5)关于C++与C语言的关系的描述中,( D )是不对的。 A. C语言是C++的一个子集 B. C语言与C++是兼容的 C. C++对C语言进行了一些改进 D. C++和C语言都是面向对象的 【结果分析】 C语言是面向过程的。C++语言是一种经过改进的更为优化的C语言,是一种混合型语言,既面向过程也面向对象。 (6)面向对象的程序设计将数据结构与( A )放在一起,作为一个相互依存、不可分割的整体来处理。 A. 算法 B. 信息 C. 数据隐藏 D. 数据抽象 (7)下面( A )不是面向对象系统所包含的要素。 A. 重载 B. 对象 C. 类 D. 继承 【结果分析】 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 实验十三 1.实验目的 通过本次实验 (1)理解友元函数与运算符重载函数的概念; (2)学会友元函数的定义与使用方法; (3)掌握运算符重载函数的定义与使用方法; 2.实验要求 (1)编写实验程序 (2)在VC++运行环境中,输入源程序 (3)编译运行源程序 (4)输入测试数据进行程序测试; (5)写出运行结果。 3.实验内容 (1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。分别用成员函数与友元函数编写运算符重载函数。在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。 参考资料: (1)成员函数 # include 走进3D的世界 -- C++中用运算符重载实现矩阵运算 作者:周军 矩阵(Matrix)无处不在,我们的生活中到处都能找到矩阵的身影,然而此处我不想把这个定义放大,我们只讨论线性代数中的矩阵,我们要用它们来完成我们的3D变换。为什么矩阵可以完成3D变换呢?下面,我们就来介绍矩阵是如何变换坐标的: 设空间中有一坐标(x,y,z),如果我们想把它变换成另一坐标(x,’y’,z’),我们可以进行如下操作: = (x’,y’,z’,1) 这就是矩阵的妙用了。它在复杂处理变换的时候表现得尤为突出。假设我们想要把一个物体先沿z轴旋转角thetaZ,再沿x轴旋转角thetaX,我们可以进行如下操作(pseudo-code): obj*=rotX(thetaX)*rotZ(thetaZ); 注意:矩阵的乘法是不可逆的,而且我们要按变化顺序的逆序进行乘法,具体推导见计算几何相关书籍。 下面,我们进入正题:如何再C++中用重载运算符的方法来进行矩阵运算以完成线性变换呢?我们需要变换坐标,所以很自然地,我们需要一个向量(Vector)类;同时我们要进行 为直观、人性化,我选用了运算符重载这以技巧而不是简单地调用函数,下面请看我的具体实现: 以上便是CVector类的具体实现,我想对C++和线性代数有所了解的读者都能很清楚地理解这段代码,在次不累述。 上述代码的成员函数实在类外定义的,如果读者在实践中为了提高速度可以把这些成员函数定义在类内以起到内联函数的作用,可以省去参数压栈、出栈时的时间。 下面是CMatrix类的具体实现: 是不是也很好理解呢?哈哈,这就是用运算符重载的好处。不过这种方法也确实有它的不足,而且这个不足在游戏编程中是致命的,那就是效率不高,这也正是为什么Microsoft 在DirectX中也使用难看的一般函数调用来完成矩阵运算的原因。影响速度的主要原因是在使用运算符+、-、*、/等时,程序会在每次运算时创建临时对象再将临时对象返回,对于重复多次的矩阵运算来说,这无疑成为了一笔庞大的额外开销(好在现在的计算机的处理速度还算快)。但注意:在使用+=、-=、*=、/=时不会有上述问题,因为在使用这些运算符时程序只需要修改第一个对象不需要创建并返回临时对象。所以在能使用+=、-=、*=、/=时尽量不要使用单一的=、-、*、/运算符。 好了,这两个类我们已经封装好了,下面还有什么呢?是的,忘了向大家交代旋转矩阵了: 实验五运算符重载 【实验目的】 1.进一步了解运算符重载的概念和使用方法。 2.掌握几种常用的运算符重载的方法。 3.了解转换构造函数的使用方法。 4.了解在Visual C++6.0环境下进行运算符重载要注意的问题. 【实验要求】 1.硬件基本配置:Intel PentiumIII以上级别的CPU,大于64MB的内存。 2.软件要求:Window 2000操作系统,Visual Studio 6.0或更高版本开发环境。 3.实验学时:2学时 4.实现实验内容中的题目。 5.写实验报告 【实验内容】 (1)声明一个复数类Complex,重载运算符“+’’,“一”,“*”,“/”使之能用于复数的加、减、乘、除.运算符重载函数作为Complex类的成员函数,重载流提取运算符实现对复数的输出。编程序,分别求两个复数之和、差、积和商并用重载后的流运算符进行输出。 请思考:你编的程序能否用于一个整数与一个复数的算术运算?如4+ (5-2i). (2)声明一个复数类Complex,重载运算符“+“,使之能用于复数的加法运算。 参加运算的两个运算量可以都是类对象.也可以其中有一个是整数,顺序任意。例如, cl+c2, i+cl,cl+i均合法(设i为整数,c1, c2为复数)。 运行程序.分别求两个复数之和、整数和复数之和。 (3)有两个矩阵a和b,均为2行3列。求两个矩阵之和。重载运算符“+”,使之能用于矩阵相加。如c=a+b。重载流提取运算符实现对矩阵的输出如: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++中不能重载的运算符是( ) Task8-1 /* 1. 定义一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。将运算符函数重载为非成员、非友元的普通函数。编写程序,求两个复数之和*/ #include /*2. 定义一个复数类Complex,重载运算符“+”、”-“、”*”、”/”, 使之能用于复数的加、减、乘、除。运算符重载函数作为Complex类的成员函数,编程,分别求两个复数之和差积商。 */ #include 实验十运算符重载1.实验目的及要求 1)掌握运算符重载的基本概念和方法。 2)熟习几种特殊的运算符的重载。 2.实验内容 1.分析下面的程序,指出程序运行的结果: 1) #include 运行结果为: 30,30 Press any key to continue 2)分析下面程序,指出程序运行的结果: #include 二、运算符重载(运算符重载的基本概念、运算符重载方法、运算符重载规则、特殊运算符重载和类型转换) 单选题10道: 1、假定要对类AB定义加号操作符重载成员函数,实现两个AB类对象的加法,并返回相加结果,则该成员函数的声明语句为( B )。 A. AB operator+(AB& a,AB& b) B. AB operator+(AB& a) C. operator+(AB a) D. AB &operator+( ) 2、关于运算符重载,下面的叙述错误的是()。 A.运算符预定义的操作数个数不能改变 B.重载不能改变运算符的优先级顺序 C.参数的类型没有限制 D.尽量使其与原意保持一致 3、在一个类中可以对一个操作符进行(D )重载。 A. 1种 B. 2种以下 C. 3种以下 D. 多种 4、重载赋值操作符时,应声明为(C )函数。 A. 友元 B. 虚 C. 成员 D. 多态 5、要在类对象使用运算符,以下不必被重载的运算符是( A )。 A. [] B. = C. ++ D. -- 6、下列运算符中,不能重载的是(C ) A.new B.() C.::D.&& 7、在表达式x+y*z中,+ 是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是( A )。 A)operator+有两个参数,operator*有两个参数 B)operator+有两个参数,operator*有一个参数 C)operator+有一个参数,operator*有两个参数 D)operator+有一个参数,operator*有一个参数 8、友元运算符obj1>obj2被C++编译器解释为()。 A) operator>(obj1,obj2) B) >(obj1,obj2) C) obj1.operator>(obj2) D) obj2.operator>(obj1) 9、已知某个类的友元函数重载了+=和-,a,b,c是该类的对象,则“a+=b-c”被C++编译器解释为()。 A) operator+=(a,operator-(b,c)) B) a.operator+=(b.operator-(c)) C) operator+=(a,b.operator-(c)) D) a.operator+=(operator-(b,c)) 10、下列运算符中,必须使用成员函数进行重载的是()。 A) == B) = C) >> D) ++ 填空题10道: 1、多数运算符既能作为类的成员函数重载,也能作为类的非成员函数重载,但运算符“[]”只能作为类的函数重载。 2、加法运算符“+”和赋值运算符“=”都重载之后,“+=”也被重载了。 3、单目运算符作为类的成员函数重载时形参。 4、利用成员函数对二元运算符重载时,其右操作数为。 5、重载运算符函数的函数名由关键字引出。 6、运算符的重载归根结底是的重载。 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. 下列关于运算符重载的描述中,正确的是()。 A. 运算符重载成为成员函数时,若参数表中无参数,重载是一元运算符 B. 一元运算符只能作为成员函数重载 C. 二元运算符重载成为非成员函数时,参数表中有一个参数 实验五运算符重载、继承 ●实验目的 1、了解类的两种使用方式。 2、学习从现有类派生出新类的方式。 3、了解在派生类中如何使用基类的成员。 4、了解基类成员在派生类中的访问控制。 5、掌握运算符重载的方法。 ●实验内容 1、从类Person中派生出一个教师类,新增的属性有专业(Specialty)、职称(Position)和主讲课程(MajorCourse,一门),并为这些属性定义相应的方法。 [实现要求] Person类的设计如下,请将空白处补充完整。 class Person { string Name; int Age; string Sex; public: void Register(char *name,int age,char *sex) { ; Age=age; Sex=sex; } string GetName() { } string GetSex() { return Sex; } int GetAge() { } void ShowMe() { cout< //带参数的构造函数去初始化各个成员的值,使其显示运行结果的第一行t.TeacherRegister("张三",40, "f","计算机","副教授","C++"); t.ShowMe(); return 0; } 运行结果如下: XXX m 0 XXX XXX XXX 张三 f 40 计算机副教授C++ [思考问题] ①在Teacher类中是否要需要重新定义ShowMe成员函数?不重新定义ShowMe成员函数能否得到上述要求的运行结果?为什么? 2、从Point类中派生出一个Line类。Line类增加一个数据成员EndPoint,计算线的长度。 [实现提示] Point类可以按下面方式进行设计: class Point{ int x,y; public: Point(int a=0,int b=0){SetPoint(a,b);} void SetPoint(int a,int b); //设置点的坐标值 int GetX(){return x;} int GetY(){return y;} void Print(); //显示点的坐标值 }; Line类增加一个数据成员EndPoint为Point类对象,注意在设计Line类的构造函数时应为其基类和对象成员EndPoint提供形参。 为了检验Line类的功能,主函数按如下方式设计: int main(){ Line line(1,1,10,10); cout<<"Line line:"; line.Print(); cout<<"\n线line的长度:"; cout< 运算符重载 一.单项选择题 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. 设有以下类定义,其中说明了“+”运算符重载函数的原型。这是一个友元函数,当类 实验十六运算符重载 一、实验目的 1、理解运算符重载作用和意义; 2、掌握类运算符和友元运算符重载的定义和使用; 3、掌握常用运算符(++、--、+、-、*、/、=、+=、-=、*=、/=、<<(插入)、>>(提取))的重载。 二、实验内容 1、下列程序定义了一个复数类,重载"+"运算符以实现复数的加法运算。 #include 《面向对象程序设计》习题 班级:学号:姓名:名单序号:成绩: 第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++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。 ②、重载之后运算符的优先级和结合性都不会改变。 ③、运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般来说,重载的功能应当与原有功能相类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 不能重载的运算符只有五个,它们是:成员运算符“.”、指针运算符“*”、作用域运算符“::”、“sizeof”、条件运算符“?:”。 运算符重载形式有两种,重载为类的成员函数和重载为类的友元函数。 运算符重载为类的成员函数的一般语法形式为: 函数类型 operator 运算符(形参表) { 函数体; } 运算符重载为类的友元函数的一般语法形式为: friend 函数类型 operator 运算符(形参表) { 函数体; } 其中,函数类型就是运算结果类型;operator是定义运算符重载函数的关键字;运算符是重载的运算符名称。 当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个;当重载为类的友元函数时,参数个数与原操作数个数相同。原因是重载为类的成员函数时,如果某个对象使用重载了的成员函数,自身的数据可以直接访问,就不需要再放在参数表中进行传递,少了的操作数就是该对象本身。而重载为友元函数时,友元函数对某个对象的数据进行操作,就必须通过该对象的名称来进行,因此使用到的参数都要进行传递,操作数的个数就不会有变化。 运算符重载的主要优点就是允许改变使用于系统内部的运算符的操作方式,以适应用户自定义类型的类似运算。 一般说来,单目运算符最好被重载为成员;对双目运算符最好被重载为友元函数,双目运算符重载为友元函数比重载为成员函数更方便此,但是,有的双目运算符还是重载为成员函数为好,例如,赋值运算符。 二、运算符重载为成员函数 对于双目运算符B,如果要重载B为类的成员函数,使之能够实现表达式oprd1 B oprd2,其中oprd1为类A的对象,则应当把B重载为A类的成员函数,该函数只有一个形参,形参的类型是oprd2所属的类型。经过重载后,表达式oprd1 B oprd2 就相当于函数调用 oprd1.operator B(oprd2). 实验5 运算符重载 1.实验目的 通过本次实验 (1)理解运算符重载函数的概念; (2)掌握运算符重载函数的定义与使用方法; 2.实验要求 (1)编写实验程序 (2)在运行环境中,输入源程序 (3)编译运行源程序 (4)输入测试数据进行程序测试; (5)写出运行结果。 3.实验内容 (1)定义一个复数类,重载“-=”运算符,使这个运算符能直接完成复数的“-=”运算。分别用成员函数与友元函数编写运算符重载函数。在主函数中定义复数对象c1(10,20)、c2(15,30),进行c2-=c1的复数运算,并输出c1、c2的复数值。 (2)定义一个数组类Array,其私有数据成员为整型一维数组a[10]。通过构造函数给a[10]赋初值。用Show函数显示a[10]的元素值。用成员函数重载运算符“+”,直接实现两个一维数组对应元素相加的运算。在主函数中定义数组a、b分别为: int a[10]={1,2,3,4,5,6,7,8,9,10}; int b[10]={4,5,6,7,8,9,10,11,12,13}; 用Array定义三个数组对象arr1(a)、arr2(b)、arr3,执行arr3=arr1+arr2运算,输出arr3的数组元素值。 (3)定义一个人民币类Money,类中数据成员为元、角、分。用成员函数与友元函数重载“――”运算符,实现人民币对象的减1运算。在主函数中定义人民币对象m1=10元8角5分及对象m2、m3。对m1作前置“――”并赋给m2。对m1作后置“――”并赋给m3。显示m1、m2、m3的结果。 (4)定义描述字符串的类String,编写字符串运算符“+=”的重载函数,使运算符“+=”用于两个字符串联接操作,即用str1+=str2实现字符串函数strcat(str1,str2)的操作功能。要求分别用成员函数与友元函数编写运算符重载函数。在主函数中定义字符串对象s1("software and ")与s2("hardware"),进行s1+=s2的字符串联接,并输出s1、s2的值。 第4章运算符重载 4.1 什么是运算符重载 所谓重载,就是重新赋予新的含义。函数重载就是对一个已有的函数赋予新的含义,使之实现新功能。 运算符也可以重载。实际上,我们已经在不知不觉之中使用了运算符重载。如:+可以对int、float、double的数据进行加法运算。 现在要讨论的问题是:用户能否根据自己的需要对C++已提供的运算符进行重载,赋予它们新的含义,使之一名多用。譬如,能否用“+”号进行两个复数、两个点的相加。在C++中不能在程序中直接用运算符“+”对复数进行相加运算。用户必须自己设法实现复数相加。 例如用户可以通过定义一个专门的函数来实现复数相加。见下例。 //例4.1 通过函数来实现复数相加。 #include 运算符重载基础概念练习题
【g】c++第13章答案
c 运算符的重载习题答案
实验8--友元函数与运算符重载函数
C中用运算符重载实现矩阵运算
实验五 运算符重载
第十章 运算符重载 复习题
c++运算符重载习题
实验十_运算符重载
运算符重载题目
运算符重载知识题
实验5-运算符重载、继承 ( 1 )
运算符重载练习题
实验十六运算符重载解读
第7章 运算符重载-习题
C++运算符重载
实验5 运算符重载
运算符重载