
第四章运算符重载 4.1什么是运算符重载 4.2运算符重载的方法 4.3运算符重载的规则 4.4运算符重载函数作为类成员函数和友元函数 4.5重载双目运算符 4.6重载单目运算符 4.7重载流插入和流提取运算符 4.8不同类型数据间的转换
0 4.1 什么是运算符重载 4.2 运算符重载的方法 4.3 运算符重载的规则 4.4 运算符重载函数作为类成员函数和友元函数 4.5 重载双目运算符 4.6 重载单目运算符 4.7 重载流插入和流提取运算符 4.8 不同类型数据间的转换 第四章 运算符重载

导入:一个小例子为什么需要运算符重载 例题4-1: 利用前面所学的知识写一段程序,定 义一个复数类complex, 包含一对双精度浮点数real和imag。 及其相应的构造函数。 并使用成员函数实现两个复数对象的相 加
例题4-1: 利用前面所学的知识写一段程序, 定 义一个复数类complex, 包含一对双精度浮点数real和imag。 及其相应的构造函数。 并使用成员函数实现两个复数对象的相 加。 1 导入:一个小例子为什么需要运算符重载

导入:一个小例子为什么需要运算符重载 例4-1:用函数实现复数相加 ① #include ② class complex /类定义 void complex:display() ③ {public: ② {cout<“(“<real<<“,” ④ complex ()real =0;image =0; ③ <image<“i)”<endl; ⑤ complex(double r,double i) ④ ⑧ real r;image=i;) ⑤ Int main() ⑦ complex add(complex &c2); ⑥ {complex c1(3,4),c2(5,-10),c3; ⑧ void display(); ⑦ c3=c1.add(c2); ⑨ private: ⑧ cout<“c1=“;c1.display()i ⑩ double real,image; ⑨ cout<<"c2=";c2.display(); @: ⑩ @ cout<“c1+c2=“; complex complex::add (complex &c2) complex c; c3.display(); c.realreal c2.real; return 0; c.image image c2.image; ② } 西 return c; 特点:烦琐、不方便。可不可以用c3=c1+c2的形式来表达呢? 只要对”+”号进行重载,复数加法就可以写成这种形式c3=c1+c2
2 ① void complex::display( ) ② { cout ② class complex //类定义 ③ {public: ④ complex ( ) { real = 0;image = 0; } ⑤ complex (double r, double i) ⑥ { real = r; image = i; } ⑦ complex add (complex &c2); ⑧ void display( ); ⑨ private: ⑩ double real, image; ⑪ }; ⑫ complex complex::add (complex &c2) ⑬ { complex c; ⑭ c.real = real + c2.real; ⑮ c.image = image + c2.image; ⑯ return c; ⑰ } 导入:一个小例子为什么需要运算符重载

4.1什么是运算符重载 一、运算符 1、x+y×z 简洁 2、C++为其内部类型提供了一组运算符。 如a=3+5b=6-2i++a<b等 很多概念如复数运算、矩阵代数、逻辑信号、 字符串等需要使用用户自定义类型表示: 3、如何为这些类定义各种运算符? 使用运算符重载
一 、运算符 1、 x+y×z 2、 C++为其内部类型提供了一组运算符。 如 a=3+5 b=6-2 i++ a<b 等 很多概念如复数运算、矩阵代数、逻辑信号、 字符串等需要使用用户自定义类型表示; 3、如何为这些类定义各种运算符? 使用运算符重载 4.1 什么是运算符重载 简洁

4.1什么是运算符重载 二、运算符重载的意义 运算符重载是C++的一项强大功能。通过重载 ,可以扩展C++运算符的功能,使它们能够操作 用户自定义的数据类型,增加程序代码的直观性 和可读性。 三、运算符重载的定义 重载,就是重新赋予新的含义。运算符重载是 对已有的运算符赋予多重含义,使同一个运算符 作用于不同类型的数据导致不同行为的发生。 。9
二、运算符重载的意义 运算符重载是C++的一项强大功能。通过重载 ,可以扩展C++运算符的功能,使它们能够操作 用户自定义的数据类型,增加程序代码的直观性 和可读性。 三、运算符重载的定义 重载,就是重新赋予新的含义。运算符重载是 对已有的运算符赋予多重含义,使同一个运算符 作用于不同类型的数据导致不同行为的发生。 4.1 什么是运算符重载

4.2运算符重载的方法 一、运算符重载的方法: 1、定义一个重载运算符的函数: 2、在需要执行重载的运算符时,系统就自动调 用该重载的运算符函数 二、重载运算符函数的一般格式: 函数类型operator运算符名称(形参表列) {对运算符的重载处理} 思考:两个复数对象相加的运算符重载函数如何写? 5
5 4.2 运算符重载的方法 一 、运算符重载的方法: 1、定义一个重载运算符的函数; 2、在需要执行重载的运算符时,系统就自动调 用该重载的运算符函数 二、重载运算符函数的一般格式: 函数类型 operator 运算符名称 (形参表列) { 对运算符的重载处理 } 思考:两个复数对象相加的运算符重载函数如何写?

4.2运算符重载的方法 三、类运算符重载形式 1、非静态成员函数 以类成员形式重载的运算符参数处比实际参数少一个 例如:籍用戡厘指断针隐武机法运算符 则形式如下: class Complex{ double real,image; public: Complex operator+(Complex &c2){.) ●●●●●● : 这里的引用换成普通的对象名b可以吗? 6
6 4.2 运算符重载的方法 三、类运算符重载形式 1、非静态成员函数 以类成员形式重载的运算符参数比实际参数少一个, 例如:若用友元函数重载Complex类的加法运算符, 则形式如下: class Complex{ double real,image; public: Complex operator+(Complex &c2){.} . }; 第1个参数是以this指针隐式传递的 这里的引用换成普通的对象名b 可以吗?

4.2运算符重载的方法 2、友元函数 如果将运算符函数作为类的友元重载,它需要的 参数个数就与运算符实际需要的参数个数相同。 比如,若用友元函数重载Complex类的加法运 算符,则形式如下: class Complex{ friend Complex operator+(Complex &c1,Complex &c2)i /. :
2、友元函数 如果将运算符函数作为类的友元重载,它需要的 参数个数就与运算符实际需要的参数个数相同。 比如,若用友元函数重载Complex类的加法运 算符,则形式如下: class Complex{ . friend Complex operator+(Complex &c1,Complex &c2); //. }; 4.2 运算符重载的方法

4.2运算符重载的方法 四、运算符重载例题 例题4-2、写一段完整的程序用类的成员函数重载 Complex类的加法和乘法运算符。使得下面的代码能够正 常运行。 void main( {complex a(1,3.1),b(1.2,2): complex c=b; a=b+c; b=b+c*a; c=a*b+complex(1,2);} (a+bi)(c+di)=(ac-bd)+(bc+ad)i 例题4-3、写一段完整的程序用友元函数重载Complex 类的加法运算符
四、运算符重载例题 例题4-2、写一段完整的程序 用类的成员函数重载 Complex类的加法和乘法运算符。使得下面的代码能够正 常运行。 void main() {complex a(1,3.1),b(1.2,2) ; complex c=b; a=b+c; b=b+c*a; c=a*b+complex(1,2);} 注(a+bi)(c+di)=(ac-bd)+(bc+ad)i 例题4-3、写一段完整的程序用友元函数重载Complex 类的加法运算符 4.2 运算符重载的方法

例题4-2使用成员函数重载Complex类的加法和乘法运算 签 #include complex complex:operator*( using namespace std; complex &c2) class complex /类定义 complex c; double real,image; c.real real c2.real- public: image*c2.image; complex(double r=0,double i=0) c.image=image*c2.real+real real=r;image=i;} c2.image; return c; void show() {cout<<reak<"+"<<image<<"i"<<endl; complex operator+(complex &c2); void main() {complex a(1,3.1),b(1.2,2); complex operator*(complex &c2); complex c=b; }; a=b+c; complex complex:operator+(complex &c2) b=b+c*a; complex c; c=a*b+complex(1,2); c.real=real c2.real; a.show(); c.image=image+c2.image; b.show(); return c; c.show();} 9
9 例题4-2 使用成员函数重载Complex类的加法和乘法运算 符 #include using namespace std; class complex // 类定义 { double real, image; public: complex (double r = 0, double i = 0) { real = r; image = i;} void show( ) {cout<<real<<"+"<<image<<"i"<<endl; } complex operator+( complex &c2); complex operator*( complex &c2); }; complex complex::operator+ ( complex &c2) { complex c; c.real = real + c2.real; c.image = image + c2.image; return c ; } complex complex::operator* ( complex &c2) { complex c; c.real = real * c2.realimage*c2.image; c.image = image*c2.real+real * c2.image; return c ; } void main( ) { complex a(1,3.1),b(1.2,2) ; complex c=b; a=b+c; b=b+c*a; c=a*b+complex(1,2); a.show(); b.show(); c.show();}