实现复数类中的运算符重载
定义一个复数类重载运算符+、-、*、/,使之能用于复数的加减乘除。
(1)方案一:请用类的成员函数完成运算符的重载;
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; }; //下面定义成员函数 int main() { Complex c1(3,4),c2(5,-10),c3; cout<<"c1="; c1.display(); cout<<"c2="; c2.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(); c3=c1/c2; cout<<"c1/c2="; c3.display(); system("pause"); return 0; }
解答:
#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-imag*c2.imag; c.imag=real*c2.imag+imag*c2.real; 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=(c2.real*imag-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; cout<<"c1="; c1.display(); cout<<"c2="; c2.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(); c3=c1/c2; cout<<"c1/c2="; c3.display(); system("pause"); return 0; }
(2)方案二:请用类的友元函数,而不是成员函数,完成上面提及的运算符的重载;
#include<iostream> using namespace std; class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} friend Complex operator+ (Complex &c1,Complex &c2); friend Complex operator- (Complex &c1,Complex &c2); friend Complex operator* (Complex &c1,Complex &c2); friend Complex operator/ (Complex &c1,Complex &c2); void display(); private: double real; double imag; }; //下面定义成员函数 Complex operator+(Complex &c1,Complex &c2) { return Complex (c1.real+c2.real,c1.imag+c2.imag); } Complex operator-(Complex &c1,Complex &c2) { return Complex (c1.real-c2.real,c1.imag-c2.imag); } Complex operator*(Complex &c1,Complex &c2) { return Complex (c1.real*c2.real-c1.imag*c2.imag,c1.real*c2.imag+c1.imag*c2.real); } Complex operator/(Complex &c1,Complex &c2) { return Complex ((c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(c2.real*c1.imag-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag)); } void Complex::display( ) { cout<<"("<<real<<","<<imag<<"i)"<<endl; } int main() { Complex c1(3,4),c2(5,-10),c3; cout<<"c1="; c1.display(); cout<<"c2="; c2.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(); c3=c1/c2; cout<<"c1/c2="; c3.display(); system("pause"); return 0; }
#include<iostream> using namespace std; class Complex { public: Complex(){real=0;imag=0;} Complex(double r,double i){real=r;imag=i;} friend Complex operator+ (Complex &c1,Complex &c2); friend Complex operator+ (double a,Complex &b); friend Complex operator+ (Complex &b,double a); friend Complex operator- (Complex &c1,Complex &c2); friend Complex operator- (double a,Complex &b); friend Complex operator- (Complex &b,double a); friend Complex operator* (Complex &c1,Complex &c2); friend Complex operator* (double a,Complex &b); friend Complex operator* (Complex &b,double a); friend Complex operator/ (Complex &c1,Complex &c2); friend Complex operator/ (double a,Complex &b); friend Complex operator/ (Complex &b,double a); void display(); private: double real; double imag; }; //下面定义成员函数 Complex operator+(Complex &c1,Complex &c2) { return Complex (c1.real+c2.real,c1.imag+c2.imag); } Complex operator+ (double a,Complex &b) { return Complex (a+b.real,b.imag); } Complex operator+ (Complex &b,double a) { return Complex (b.real+a,b.imag); } Complex operator-(Complex &c1,Complex &c2) { return Complex (c1.real-c2.real,c1.imag-c2.imag); } Complex operator- (double a,Complex &b) { return Complex (a-b.real,-b.imag); } Complex operator- (Complex &b,double a) { return Complex ( b.real-a,b.imag); } Complex operator*(Complex &c1,Complex &c2) { return Complex (c1.real*c2.real-c1.imag*c2.imag,c1.real*c2.imag+c1.imag*c2.real); } Complex operator* (double a,Complex &b) { return Complex (a*b.real,a*b.imag); } Complex operator* (Complex &b,double a) { return Complex ( b.real * a, b.imag * a ); } Complex operator/(Complex &c1,Complex &c2) { return Complex ((c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag),(c2.real*c1.imag-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag)); } Complex operator/ (double a,Complex &b) { return Complex ((a*b.real)/(b.real*b.real+b.imag*b.imag), b.imag/(b.real*b.real+b.imag*b.imag)); } Complex operator/ (Complex &b,double a) { return Complex(b.real/a,b.imag/a); } void Complex::display( ) { cout<<"("<<real<<","<<imag<<"i)"<<endl; } int main() { Complex c1(3,4),c2(5,-10),c3; cout<<"c1="; c1.display(); cout<<"c2="; c2.display(); c3=c1+c2; cout<<"c1+c2="; c3.display(); c3=c1+1.2; cout<<"c1+1.2="; c3.display(); c3=1+c1; cout<<"1+c1="; c3.display(); c3=c1-c2; cout<<"c1-c2="; c3.display(); c3=1-c2; cout<<"1-c2="; c3.display(); c3=c1*c2; cout<<"c1*c2="; c3.display(); c3=2*c1; cout<<"2*c1="; c3.display(); c3=c1/c2; cout<<"c1/c2="; c3.display(); c3=c2/2; cout<<"c2/2="; c3.display(); system("pause"); return 0; }
上机感言:写完程序改错已成习惯,如果没错会显得不自然。笔试该咋办呢??