}
Date:
:
Date(intm,intd,inty)
{month=m;
day=d;
year=y;
}
intmain()
{Timet1(10,13,56);
Dated1(12,25,2004);
t1.display(d1);
return0;
}
请读者分析和运行此程序,注意友元函数Time:
:
display的作用。
将程序中的display函数不放在Time类中,而作为类外的普通函数,然后分别在Time和Date类中将display声明为友元函数。
在主函数中调用display函数,display函数分别引用Time和Date两个类的对象的私有数据,输出年、月、日和时、分、秒。
修改后上机调试和运行。
实验5运算符重载
1、实验目的
(1)进一步了解运算符重载的概念和使用方法。
(2)掌握几种常用的运算符重载的方法。
(3)了解转换构造函数的使用方法。
(4)了解在VisualC++6.0环境下进行运算符重载要注意的问题。
2、实验内容
事先编写好程序,上机调试和运行程序,分析结果。
(1)声明一个复数类Complex,重载运算符“+”、“-”、“*”、“/”,使之能用于复数的加、减、乘、除,运算符重载函数作为Complex类的成员函数。
编程序,分别求两个复数之和、差、积和商。
complex.h文件:
#include
classcomplex
{
private:
doubleRe,Im;//复数的实部与虚部
public:
complex(){Re=Im=0;}//不带参数的构造函数
complex(doubler){Re=r;Im=0;}//只置实部的构造函数
complex(doubler,doublei){Re=r;Im=i;}//分别置实部、虚部的构造函数
doublegetReal(){returnRe;}//取复数实部
doublegetImag(){returnIm;}//取复数虚部
voidsetReal(doubler){Re=r;}//修改复数实部
voidsetImag(doublei){Im=i;}//修改复数虚部
complex&operator=(complex&ob){Re=ob.Re;Im=ob.Im;}//复数赋值
complex&operator+(complex&ob);//重载函数:
复数四则运算
complex&operator-(complex&ob);
complex&operator*(complex&ob);
complex&operator/(complex&ob);
voidDisplay();
};
complex.cpp文件:
//复数类complex的相关服务的实现放在C++源文件complex.cpp中
#include
#include
#include"complex.h"
complex&complex:
:
operator+(complex&ob)
{
//重载函数:
复数加法运算。
complex*result=newcomplex(Re+ob.Re,Im+ob.Im);
return*result;
}
complex&complex:
:
operator-(complex&ob){
//重载函数:
复数减法运算
complex*result=newcomplex(Re-ob.Re,Im-ob.Im);
return*result;
}
complex&complex:
:
operator*(complex&ob){
//重载函数:
复数乘法运算
complex*result=
newcomplex(Re*ob.Re-Im*ob.Im,Im*ob.Re+Re*ob.Im);
return*result;
}
complex&complex:
:
operator/(complex&ob){
//重载函数:
复数除法运算
doubled=ob.Re*ob.Re+ob.Im*ob.Im;
complex*result=newcomplex((Re*ob.Re+Im*ob.Im)/d,
(Im*ob.Re-Re*ob.Im)/d);
return*result;
}
voidcomplex:
:
Display()
{
if(fabs(Re)>0.00001)
cout<if(fabs(Im)>0.00001)
{
if(Im>=0.0)
cout<<"+"<else
cout<<"-"<}
}
请思考:
你编的程序能否用于一个整数与一个复数的算术运算?
如4+(5-2i)
(2)声明一个复数类Complex,重载运算符“+”,使之能用于复数的加法运算。
参加运算的两个运算量可以都是类对象,也可以其中有一个是整数,顺序任意。
例如:
c1+c2,i+c1,c1+i,均合法(设i为整数,c1,c2为复数)。
运行程序,分别求两个复数之和、整数和复数之和。
#include
#include
#include
classComplex
{
public:
friendComplexoperator+(constComplex&cmp1,constComplex&cmp2);
friendComplexoperator-(constComplex&cmp1,constComplex&cmp2);
friendComplexoperator*(constComplex&cmp1,constComplex&cmp2);
friendComplexoperator/(constComplex&cmp1,constComplex&cmp2);
friendistream&operator>>(istream&ins,Complex&p);
friendostream&operator<<(ostream&outs,Complex&p);
Complex();
Complex(doublea);
Complex(doublea,doublebi);
private:
doublereal;
doubleimaginary;
};
istream&operator>>(istream&ins,Complex&p)
{
ins>>p.real>>p.imaginary;
returnins;
}
ostream&operator<<(ostream&outs,Complex&p)
{
outs<<"therationalis"<
returnouts;
}
Complex:
:
Complex()
{
real=0;
imaginary=0;
}
Complex:
:
Complex(doublea)
{
real=a;
imaginary=0;
}
Complex:
:
Complex(doublea,doublebi)
{
real=a;
imaginary=bi;
}
Complexoperator+(constComplex&cmp1,constComplex&cmp2)
{
Complextemp;
temp.real=cmp1.real+cmp2.real;
temp.imaginary=cmp1.imaginary+cmp2.imaginary;
returntemp;
}
Complexoperator-(constComplex&cmp1,constComplex&cmp2)
{
Complextemp;
temp.real=cmp1.real-cmp2.real;
temp.imaginary=cmp1.imaginary-cmp2.imaginary;
returntemp;
}
Complexoperator*(constComplex&cmp1,constComplex&cmp2)
{
Complexa;
a.real=cmp1.real*cmp2.real+cmp1.imaginary*cmp2.imaginary;
a.imaginary=cmp1.real*cmp2.imaginary+cmp1.imaginary*cmp2.real;
returna;
}
Complexoperator/(constComplex&cmp1,constComplex&cmp2)
{
Complexc;
doublea;
a=cmp2.real*cmp2.real-cmp2.imaginary*cmp2.imaginary;
c.real=cmp1.real*cmp2.real-cmp1.imaginary*cmp2.imaginary;
c.real=c.real/a;
c.imaginary=cmp2.real*cmp1.imaginary-cmp1.imaginary*cmp2.real;
c.imaginary/=a;
returna;
}
intmain()
{
Complexx1,x2(3.4,4),x3;
x3=x1*x2;
cout<x3=x1+x2;
cout<x3=x1-x2;
cout<cout<<"inputtwonumber!
"<cin>>x3;
cout<
return0;
}
(3)有两个矩阵a和b,均为2行3列。
求两个矩阵之和。
重载运算符“+”,使之能用于矩阵相加。
如c=a+b。
如c=a+b。
#include
usingnamespacestd;
classJZ
{
public:
JZ(intm,intn);
friendJZoperator+(JZ&jz1,JZ&jz2);
friendistream&operator>>(istream&input,JZ&jz);
friendostream&operator<<(ostream&output,JZ&jz);
private:
int*pt;
intjz;
intm;
intn;
};
JZ:
:
JZ(intm,intn)
{m=2;n=3;
intjz[m][n];
}
JZoperator+(JZ&jz1,JZ&jz2)
{JZjz3(2,3);
jz1.pt=&(jz1.jz);
jz2.pt=&(jz2.jz);
jz3.pt=&(jz3.jz);
for(inti=0;i<2;i++)
for(intj=0;j<3;j++)
{*(jz3.pt)=*(jz1.pt)+*(jz2.pt);
cout<<*(jz3.pt)<<"";
jz3.pt++;
jz2.pt++;
jz1.pt++;
}
cout<returnjz3;
}
ostream&operator<<(ostream&output,JZ&jz)
{jz.pt=&jz.jz;
for(inti=0;i<2;i++)
for(intj=0;j<3;j++)
{cout<<*(jz.pt)<<"";
jz.pt++;}
cout<returnoutput;
}
istream&operator>>(istream&input,JZ&jz)
{
jz.pt=&jz.jz;
for(inti=0;i<2;i++)
for(intj=0;j<3;j++)
{cin>>*(jz.pt);
jz.pt++;}
jz.pt=&jz.jz;
for(inti=0;i<2;i++)
for(intj=0;j<3;j++)
{cout<<*jz.pt<<"";
jz.pt++;}
cout<jz.pt=&jz.jz;
returninput;
}
intmain()
{
JZa(2,3);
cin>>a;
JZb(2,3);
cin>>b;
JZc(2,3);
c=a+b;
cout<return0;
}
(4)声明一个Teacher(教师)类和一个Student(学生)类,二者有一部分数