第4章运算符重载.ppt





《第4章运算符重载.ppt》由会员分享,可在线阅读,更多相关《第4章运算符重载.ppt(44页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第4章章 运算符重载运算符重载 4.1 什么是运算符重载什么是运算符重载4.2 运算符重载的方法运算符重载的方法4.3 重载运算符的规则重载运算符的规则4.4 运算符重载函数作为类成员函数和运算符重载函数作为类成员函数和 友元函数友元函数4.5 重载双目运算符重载双目运算符4.6 重载单目运算符重载单目运算符4.7 重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符14.1 什么是运算符重载什么是运算符重载对已有的运算符赋予新的含义,用一个对已有的运算符赋予新的含义,用一个运算符表示不同功能的运算,这就是运算符表示不同功能的运算,这就是运运算符重载算符重载。运算符重载的本质:对已有
2、的运算符赋运算符重载的本质:对已有的运算符赋予多重含义。予多重含义。2class Complex public:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex complex_add(Complex&c2);void display();private:double real;double imag;例例4.1 通过成员函数实现复数的加法通过成员函数实现复数的加法3Complex Complex:complex_add(Complex&c2)Complex c;c.real=real+c2.real;
3、c.imag=imag+c2.image;return c;void Complex:display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=plex_add(c2);coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;4运算符重载的方法运算符重载的方法:定义一个重载运算符:定义一个重载运算符的函数的函数,在需要时系统自动调用该函数,在需要时系统自动调用该函数,完成相应的运算。完成相应的运算。运算符重载实质上是
4、函数的重载。运算符重载实质上是函数的重载。运算符重载函数的格式是:运算符重载函数的格式是:函数函数类型类型 operator 运算符运算符名名(形参形参)对对运算符的重载处理运算符的重载处理 4.2 运算符重载的方法运算符重载的方法5class Complexpublic:Complex()real=0;imag=0;Complex(double r,double i)real=r;imag=i;Complex operator+(Complex&c2);void display();private:double real;double imag;例例4.2 重载运算符重载运算符+,用于两个复
5、数相加。,用于两个复数相加。函数名函数名6Complex Complex:operator+(Complex&c2)Complex c;c.real=real+c2.real;c.imag=imag+c2.imag;return c;void Complex:display()cout(real,imagi)endl;7int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;等价于等价于c1.operato
6、r+(c2)8 必要性必要性sC+中预定义的运算符其运算对象只能中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定是基本数据类型,而不适用于用户自定义类型义类型(如类如类)实现机制实现机制s将指定的运算表达式转化为对运算符函将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数数的调用,运算对象转化为运算符函数的实参。的实参。4.2 运算符重载的方法运算符重载的方法9运算符重载的好处:运算符重载和类结合运算符重载的好处:运算符重载和类结合起来,可以在起来,可以在C+中定义出有实际意义中定义出有实际意义而使用方便的新的数据类型。而使用方便的新的数据类型。M注意:运算符
7、被重载后,其原来的功能仍注意:运算符被重载后,其原来的功能仍然保留,编译系统根据运算表达式的上下然保留,编译系统根据运算表达式的上下文决定是否调用运算符重载函数。文决定是否调用运算符重载函数。4.2 运算符重载的方法运算符重载的方法101.C+不允许用户自己定义新的运算符,不允许用户自己定义新的运算符,只允许对已有的部分运算符进行重载。只允许对已有的部分运算符进行重载。2.不能重载的运算符只有不能重载的运算符只有5个:个:.成员运算符成员运算符.*成员指针运算符成员指针运算符:域运算符域运算符sizeof 长度运算符长度运算符?:条件运算符条件运算符3.重载不能改变运算符操作数的个数。重载不能
8、改变运算符操作数的个数。4.3 重载运算符的规则重载运算符的规则114.重载不能改变运算符的优先级。重载不能改变运算符的优先级。5.重载不能改变运算符的结合性。重载不能改变运算符的结合性。6.重载运算符的函数不能有默认的参数。重载运算符的函数不能有默认的参数。7.运算符重载函数必须和用户定义的自定运算符重载函数必须和用户定义的自定义类型的对象一起使用,其参数至少有义类型的对象一起使用,其参数至少有一个类对象或类对象的引用。一个类对象或类对象的引用。4.3 重载运算符的规则重载运算符的规则128.用于类对象的运算符一般必须重载,用于类对象的运算符一般必须重载,但是运算符但是运算符=和和&除外。除
9、外。9.应当使重载运算符的功能类似于该运应当使重载运算符的功能类似于该运算符作用于标准类型数据时所实现的算符作用于标准类型数据时所实现的功能。功能。10.运算符重载函数可以是类运算符重载函数可以是类的成员函数,的成员函数,也可以是类的友元函数也可以是类的友元函数,还可以是普,还可以是普通函数。通函数。4.3 重载运算符的规则重载运算符的规则13重载为类成员函数时重载为类成员函数时参数个数参数个数=原操作数个数原操作数个数-1重载为友元函数时重载为友元函数时 参数个数参数个数=原操作数个数原操作数个数 且至少应该有一个自定义类型的形参且至少应该有一个自定义类型的形参例例4.3 将加法运算符重载为
10、适用于复数加将加法运算符重载为适用于复数加法,重载函数作为类的友元函数。法,重载函数作为类的友元函数。4.4 运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数14#include class Complex public:Complex()real=0;imag=0;Complex(double r)real=r;imag=0;Complex(double r,double i)real=r;imag=i;friend Complex operator+(Complex&c1,Complex&c2);void display();private:double rea
11、l;double imag;15Complex operator+(Complex&c1,Complex&c2)return Complex(c1.real+c2.real,c1.imag+c2.imag);void Complex:display()cout(real,imagi)endl;int main()Complex c1(3,4),c2(5,-10),c3;c3=c1+c2;coutc1=;c1.display();coutc2=;c2.display();coutc1+c2=;c3.display();return 0;等价于等价于c3=operator+(c1,c2)16如想将
12、一个复数和一个整数相加,运算符如想将一个复数和一个整数相加,运算符重载函数作为成员函数定义如下:重载函数作为成员函数定义如下:Complex Complex:operator+(int&i)return Complex(real+i,imag);注意在运算符注意在运算符+的左侧必须是的左侧必须是Complex类对象,程序中可以写成:类对象,程序中可以写成:c3=c2+i;不能写成:不能写成:c3=i+c2;什么时候用成员函数或友元函数什么时候用成员函数或友元函数17如果要求在使用重载运算符时,运算符左如果要求在使用重载运算符时,运算符左侧操作数不是对象,就不能使用前面定义侧操作数不是对象,就不
13、能使用前面定义的运算符重载函数,可以将运算符重载函的运算符重载函数,可以将运算符重载函数定义为友元函数:数定义为友元函数:friend Complex operator+(int&i,Complex&c)return Complex(c.real+i,c.imag);友元函数不要求第一个参数必须是类类型,友元函数不要求第一个参数必须是类类型,但是要求实参要与形参一一对应:但是要求实参要与形参一一对应:c3=i+c2;/okc3=c2+i;/error什么时候用成员函数或友元函数什么时候用成员函数或友元函数18为了实现加法的交换率,必须定义两个运算符重为了实现加法的交换率,必须定义两个运算符重载
14、函数,记住成员函数要求运算符左侧的操作数载函数,记住成员函数要求运算符左侧的操作数必须是自定义类型的对象,而友元函数没有这个必须是自定义类型的对象,而友元函数没有这个限制,可以用下面两个组合中任意一个:限制,可以用下面两个组合中任意一个:成员函数成员函数(左操作数是对象,右操作数是非对象左操作数是对象,右操作数是非对象)、友、友元函数元函数(左操作数是非对象,右操作数是对象左操作数是非对象,右操作数是对象)友元函数友元函数(左操作数是对象,右操作数是非对象左操作数是对象,右操作数是非对象)、友、友元函数元函数(左操作数是非对象,右操作数是对象左操作数是非对象,右操作数是对象)什么时候用成员函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载

限制150内