方案一: 请用类的成员函数完成运算符的重载。
#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; }; //下面定义成员函数 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; } Complex Complex::operator+(Complex &c2) { return Complex(real+c2.real,imag+c2.imag); } Complex Complex::operator-(Complex &c2) { return Complex(real-c2.real,imag-c2.imag); } Complex Complex::operator*(Complex &c2) { return Complex(real*c2.real-imag*c2.imag,real*c2.imag+imag*c2.real); } Complex Complex::operator/(Complex &c2) { double a=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); double b=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); return Complex(a,b); } void Complex::display() { cout<<real<<"+"<<imag<<"i"<<endl; }
方案二:运用友元函数而不是成员函数,完成上面的运算符的重载。
#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; }; //下面定义成员函数 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; } 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) { double a=(c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); double b=(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag); return Complex(a,b); } void Complex::display() { cout<<real<<"+"<<imag<<"i"<<endl; }
方案三:在方案二的基础上,拓展。
#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,double s); friend Complex operator -(Complex &c1,double s); friend Complex operator *(Complex &c1,double s); friend Complex operator /(Complex &c1,double s); void display(); private: double real; double imag; }; //下面定义成员函数 int main() { Complex c1(3,4),c3; double c2=2; cout<<"c1="; c1.display(); cout<<"c2="; cout<<c2<<endl; 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; } Complex operator+(Complex &c1,double s) { return Complex(c1.real+s,c1.imag+s); } Complex operator-(Complex &c1,double s) { return Complex(c1.real-s,c1.imag-s); } Complex operator*(Complex &c1,double s) { return Complex(c1.real*s,c1.imag*s); } Complex operator/(Complex &c1,double s) { return Complex(c1.real/s,c1.imag/s); } void Complex::display() { cout<<real<<"+"<<imag<<"i"<<endl; }
总结:双目运算符的重载函数需要形参,单目运算符不需要。
并且重载运算符识别是根据数据类型计算。