int main() { Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; //c1.operator+(c2) cout←<"cl="; c1.display(); cout<<"c2=";c2.display(); cout<<"c1+c2=";c3.display(); return 0; 2017年4月26日12时 H0年务 第10章运算符重载 12 BACK NEXT
HOME int main( ) { Complex c1(3,4), c2(5,-10), c3; c3=c1+c2; // c1.operator+(c2) cout<<"c1="; c1.display( ); cout<<"c2="; c2.display( ); cout<<"c1+c2=";c3.display( ); return 0; } 2017年4月26日12时 15分 第10章 运算符重载 12
10.4运算符重载函数作为类成员函数和友元函数 Overloading Operator as Class Member Friend Function “+”是双目运算符,为什么重载函数只有一个参数? 对于c1+c2,编译系统解释为cl.operator+-(c2) c.real=real+c2.real; c.imag-imag+c2.imag; this指向cl。real即this->real,就是cl.real。 c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; ·一般将单目运算符重载为成员函数,将双目运算符 重载为友元函数。Why? 2017年4月26日12时 第10章运算符重载 BACK NEX
HOME “+”是双目运算符,为什么重载函数只有一个参数? 对于c1+c2,编译系统解释为c1.operator+(c2) c.real=real+c2.real; c.imag=imag+c2.imag; this指向c1。real即this->real,就是c1.real。 c.real=c1.real+c2.real; c.imag=c1.imag+c2.imag; •一般将单目运算符重载为成员函数,将双目运算符 重载为友元函数。Why? 2017年4月26日12时 15分 第10章 运算符重载 13
例10.3运算符重载函数作为类的友元函数 #include <iostream> using namespace std; class Complex public: Complex(){real=0;imag=0;) Complex(double r,double i)freal=r;imag=i;} friend Complex operator +(Complex &c1,Complex &c2); void display(); private: double real; double imag; 2017年4月26日12时 0店务 第10章运算符重载 14 BACK NEXT
HOME #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); void display( ); private: double real; double imag; }; 2017年4月26日12时 15分 第10章 运算符重载 14
Complex operator (Complex &c1,Complex &c2) return Complex(c1.real+c2.real,c1.imag+c2.imag);) void Complex:display() (cout<<"("<<real<","<<imag<<"i)"<<endl;) int main() { Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; ∥operator±(cl,c2) cout<<"c1=";c1.display(); cout<<"c2=";c2.display(); cout<<"c1+c2 ="c3.display(); return 0; 2017年4月26日12时 H0$务 第10章运算符重载 15 BACK NEXT
HOME Complex operator + (Complex &c1,Complex &c2) {return Complex(c1.real+c2.real, c1.imag+c2.imag);} void Complex::display( ) {cout<<"("<<real<<" , "<<imag<<"i)"<<endl;} int main( ) { Complex c1(3,4),c2(5,-10),c3; c3=c1+c2; // operator+(c1,c2) cout<<"c1="; c1.display( ); cout<<"c2="; c2.display( ); cout<<"c1+c2 ="; c3.display( ); return 0; } 2017年4月26日12时 15分 第10章 运算符重载 15
重载为成员函数or友元函数? 如将一个复数和一个整数相加: Complex Complex::operator+(int &i) return Complex(real+i,imag);} c3=c2+i; //c2.operator+(i) c3=i+c2; //i.operator+(c2),error:no operator defined which takes a left-hand operand of type 'int'(or there is no acceptable conversion) 将运算符重载函数作为成员函数,运算符左侧的操 作数必须是一个本类对象。否则运算符重载函数只 能作为非成员函数或友元函数。 2017年4月26日12时 H0务 第10章运算符重载 E
HOME 如将一个复数和一个整数相加: Complex Complex::operator+(int &i) {return Complex(real+i,imag);} c3=c2+i; //c2.operator+(i) c3=i+c2; // i.operator+(c2) ,error: no operator defined which takes a left-hand operand of type 'int' (or there is no acceptable conversion) 将运算符重载函数作为成员函数,运算符左侧的操 作数必须是一个本类对象。否则运算符重载函数只 能作为非成员函数或友元函数。 2017年4月26日12时 15分 第10章 运算符重载 16