4.2运算符重载的方法 五、解释 1、用成员函数重载complex类的加法运算符的解释 比较例4-1和4-2有如下变化: operator+-函数取代了add函数 c3=c1+c2取代了c3=c1.add(c2) ·C+编译系统将程序中的表达式c1+c2解释为 cl.operator-+(c2),即以c2为实参调用c1的运算符重载函数 operator+-(complex&c2),进行求值. ·问:都能实现结果,为什么要对运算符重载? 使用运算符重载能使用户程序易于编写、阅读和维护。10
10 4.2 运算符重载的方法 五、解释 1、用成员函数重载complex类的加法运算符的解释 比较例4-1和4-2有如下变化: – operator+函数取代了add函数 – c3=c1+c2取代了c3=c1.add (c2) • C++ 编 译 系 统 将 程 序 中 的 表 达 式 c1+c2 解释为 c1.operator+(c2),即以c2为实参调用c1的运算符重载函数 operator+( complex &c2),进行求值. • 问:都能实现结果,为什么要对运算符重载? – 使用运算符重载能使 用户程序易于编写、阅读和维护
① #include <iostream> 例题4-3 ② class complex /类定义 ③ private:double real,image; 运算符重载函 ④ public: 数作为类友元函 ⑤ complex(double r=0,double i=0) ⑥ freal=r;image=i;} 数。 ⑦ void show() ⑧ cout<<real<<((image>=0)?'+':'la') <<image<<'i'<<endl; 复数加法,将运 ⑨ friend complex operator+(complex &c1,complex &c2); ⑩ ∥类的友元函数,2个参数c1,c2 算符+重载为友 ① }; 元函数。 ② complex operator+(complex &c1,complex &c2) ⑧ complex c; ④ c.real=c1.real+c2.real;c.image=c1.image+c2.image; ⑤ return c; ⑤ ⑩ void main() ⑧ {complex c1(1.5,3),c2(1,4.5); ⑨ complex c3;c3=c1+c2; 四 c3.show(); 11 21】
11 例题4-3 运算符重载函 数作为类友元函 数。 复数加法,将运 算符+重载为 友 元函数。 ① #include <iostream> ② class complex //类定义 ③ { private: double real,image; ④ public: ⑤ complex(double r=0,double i=0) ⑥ {real=r; image=i;} ⑦ void show() ⑧ { cout<<real<<((image>=0)?'+':'\a') <<image<<'i'<<endl; } ⑨ friend complex operator+(complex &c1,complex &c2); ⑩ // 类的友元函数,2个参数c1,c2 ⑪ }; ⑫ complex operator+ (complex &c1,complex &c2) ⑬ { complex c; ⑭ c.real=c1.real+c2.real; c.image=c1.image+c2.image; ⑮ return c; ⑯ } ⑰ void main() ⑱ { complex c1(1.5,3),c2(1,4.5); ⑲ complex c3; c3=c1+c2; ⑳ c3.show(); 21 }
4.2运算符重载的方法 五、解释 2、用类的友元函数重载complex类的加法运算符的说明 在将运算符“+”重载为非成员函数后,C++编译系 统将程序中的表达式c1+c2解释为operator+(c1,c2) 问:为什么把运算符函数作为友员函数? 因为运算符函数要访问为对象中的成员,如果运算 符函数不是类的友员,而是一个普通函数,它就没有 权限访问类的私有成员。 3、思考:使用普通函数能否重载complex类的加法运算 符 12
12 五、解释 2、用类的友元函数重载complex类的加法运算符的说明 在将运算符“+”重载为非成员函数后,C++编译系 统将程序中的表达式c1+c2解释为operator+(c1,c2) 问:为什么把运算符函数作为友员函数? 因为运算符函数要访问为对象中的成员,如果运算 符函数不是类的友员,而是一个普通函数,它就没有 权限访问类的私有成员。 3、思考:使用普通函数能否重载complex类的加法运算 符 4.2 运算符重载的方法
例题4-4运算符重载函数作为普通函数如何实现? ① include <iostream> ② class complex 例:复数加 ③ {public:I公有成员 法,将运算符 ④ double real,image; ⑤ +重载为普通 complex(double r=O,double i=O)∥构造函数 ⑥ real r;image=i;) 函数。 ⑦ void show() ⑧ {cout<<"real ="<<real<<''<<"image ="<<image<<endl; ⑨ 注意: 四 ; ① complex operator+(complex &c1,complex &c2) 普通函数只 悬 ∥普通函数,2个参数c1,c2 {complex c; 能调用公有数 ④ c.real =c1.real c2.real;c.image c1.image c2.image; 据成员。 ⑤ return c; ⑥ ⑦ void main() ® {complex ob1(1.5,3.0),ob2(1.0,5.0); ⑨ complex sum; sum ob1 ob2; 四 sum.show(); 13 21
13 例:复数加 法,将运算符 +重 载 为普 通 函数。 注意: 普通函数只 能调用公有数 据成员。 ① # include <iostream> ② class complex ③ {public: //公有成员 ④ double real, image; ⑤ complex (double r = 0, double i = 0) // 构造函数 ⑥ { real = r; image = i;} ⑦ void show( ) ⑧ {cout<<"real = "<<real<<' '<<"image = "<<image<<endl; ⑨ } ⑩ }; ⑪ complex operator+ (complex &c1, complex &c2) ⑫ //普通函数,2个参数c1 , c2 ⑬ {complex c; ⑭ c.real =c1.real + c2.real; c.image = c1.image + c2.image; ⑮ return c; ⑯ } ⑰ void main( ) ⑱ { complex ob1(1.5, 3.0), ob2(1.0, 5.0); ⑲ complex sum; sum = ob1 + ob2; ⑳ sum.show( ); 21 } 例题4-4 运算符重载函数作为普通函数如何实现?
4.2运算符重载的方法 4、是否满足交换律 思考:如何实现 c3=i+c2; c3=c2+i; 注意:如果某个运算符想接受某个内部类 型作为第一个参数,那么它自然就不可能是 成员函数了。 例4-5:多次重载友元函数实现交换律 14
4、是否满足交换律 思考:如何实现 c3=i+c2; c3=c2+i; 注意:如果某个运算符想接受某个内部类 型作为第一个参数,那么它自然就不可能是 成员函数了。 例4-5:多次重载友元函数实现交换律 14 4.2 运算符重载的方法