为复数类(Complex)增加重载的运算符-、-=、*=和/=。设++为实部和虚部各自增一,亦请重载前置与后置++运算符。
分别使用成员函数和友元函数各做一遍。并测试。
解:注意后++,返回的是原值,但实部和虚部已各自增一,所以要先保留原值,再++。
这里是使用成员函数:
#include<iostream>
using namespace std;
class complex
{
private:
double real; //实部
double imag; //虚部
public:
complex(double r = 0.0 ,double i = 0.0 ); //构造函数
void print(); //显示复数
complex operator +(complex c); //重载复数"+"
complex operator -(complex c); //重载复数"-"
complex operator *(complex c); //重载复数"*"
complex operator /(complex c); //重载复数"/"
complex operator +=(complex c); //重载复数"+="
complex operator -=(complex c); //重载复数"-="
complex operator *=(complex c); //重载复数"*="
complex operator /=(complex c); //重载复数"/="
complex operator ++(); //重载复数前缀"++"
complex operator ++(int); //重载复数后缀"++"
};
complex::complex(double r,double i)
{
real = r;
imag = i;
}
complex complex::operator +(complex c)
{ //重载复数"+"
complex temp;
temp.real=real+c.real;
temp.imag=imag+c.imag;
return temp; //返回局部变量,函数声明不可为引用,这时返回了局部变量的地址
}
complex complex::operator -(complex c)
{ //重载复数"-"
complex temp;
temp.real=real-c.real;
temp.imag=imag-c.imag;
return temp;
}
complex complex::operator *(complex c)
{ //重载复数"*"
complex temp;
temp.real=real*c.real-imag*c.imag;
temp.imag=real*c.imag+imag*c.real;
return temp;
}
complex complex::operator /(complex c)
{ //重载复数"/"
complex temp;
double d;
d=c.real*c.real+c.imag*c.imag;
temp.real=(real*c.real+imag*c.imag)/d;
temp.imag=(c.real*imag-real*c.imag)/d;
return temp;
}
complex complex::operator +=(complex c)
{ //重载复数"+="
complex temp;
temp.real=real+c.real;
temp.imag=imag+c.imag;
real=temp.real;
imag=temp.imag;
return temp;
}
complex complex::operator -=(complex c)
{ //重载复数"-="
complex temp;
temp.real=real-c.real;
temp.imag=imag-c.imag;
real=temp.real;
imag=temp.imag;
return temp;
}
complex complex::operator *=(complex c)
{ //重载复数"*="
complex temp;
temp.real=real*c.real-imag*c.imag;
temp.imag=real*c.imag+imag*c.real;
real=temp.real;
imag=temp.imag;
return temp;
}
complex complex::operator /=(complex c)
{ //重载复数"/="
complex temp; double d;
d=c.real*c.real+c.imag*c.imag;
temp.real=(real*c.real+imag*c.imag)/d;
temp.imag=(c.real*imag-real*c.imag)/d;
real=temp.real;
imag=temp.imag;
return temp;
}
complex complex::operator ++()
{ //重载复数前缀"++"
complex temp;
temp.real=++real;
temp.imag=++imag;
return temp;
}
complex complex::operator ++(int)
{ //重载复数后缀"++"
complex temp(real,imag);
real++;
imag++;
return temp;
}
void complex::print()
{ //显示复数
cout << real;
if(imag>=0) cout<<'+';
cout<<imag<<'i'<<endl;
}
int main()
{
complex A(30,40),B(15,30),C,D; //定义4个复数对象
cout<<"A为:";A.print();
C=A.operator++(1); //即C=A++完整的表达式
cout<<"C=A++后,C为:"; C.print();
cout<<"A为:";A.print();
C=A.operator++(); //即++A
cout<<"C=++A后,C为:"; C.print();
cout<<"A为:"; A.print();
C=A*B;
cout<<"C=A*B后,C为:"; C.print();
A*=B;
cout<<"A*=B后,A为:"; A.print();
C=A/B;
cout<<"C=A/B后,C为:"; C.print();
A/=B;
cout<<"A/=B后,A为: ";A.print();
cout<<"B为:"; B.print();
D=A+B+C;
cout<<"D=A+B+C后,D为:"; D.print();
A+=B+=C;
cout<<"A+=B+=C后,A为:"; A.print();
cout<<"B为:"; B.print();
D=A-B-C;
cout<<"D=A-B-C后,D为:"; D.print();
A-=B+=C;
cout<<"A-=B+=C后,A为:"; A.print();
cout<<"B为:"; B.print();
A=B;
cout<<"A=B后,A为:"; A.print();
D=A*B*C;
cout<<"D=A*B*C后,D为:"; D.print();
D=D/B/C;
cout<<"D=D/B/C后,D为:"; D.print();
A*=B*=C;
cout<<"A*=B*=C后,A为:"; A.print();
A/=B/=C/=C;
cout<<"A/=B/=C/=C后,A为:"; A.print();
return 0;
}