1、1C+程序设计第第7 7章章 运算符重载运算符重载2第第7章运算符重载章运算符重载本章学习要点本章学习要点v为什么要进行运算符重载为什么要进行运算符重载 v运算符重载的方法运算符重载的方法 v重载运算符的规则重载运算符的规则v运算符重载函数作为类成员函数和友元函数运算符重载函数作为类成员函数和友元函数v重载双目运算符重载双目运算符v重载单目运算符重载单目运算符v重载流插入运算符和流提取运算符重载流插入运算符和流提取运算符v不同类型数据间的转换不同类型数据间的转换3第第7章运算符重载章运算符重载v函数重载,就是赋给同一个函数名多个函数重载,就是赋给同一个函数名多个含义。含义。v运算符重载是指同一
2、个运算符可以施加运算符重载是指同一个运算符可以施加于不同类型的操作数上面。于不同类型的操作数上面。47.1 为什么要进行运算符重载为什么要进行运算符重载v有了针对自定义类型数据的运算符重有了针对自定义类型数据的运算符重载,使我们编程时感到十分方便,而载,使我们编程时感到十分方便,而且写出的表达式与数学表达式很相似,且写出的表达式与数学表达式很相似,符合人们的习惯。符合人们的习惯。57.2 运算符重载的方法运算符重载的方法v重载运算符的函数的一般格式如下:重载运算符的函数的一般格式如下:函数类型函数类型 operatoroperator运算符名称运算符名称(形参列表形参列表)对运算符的重载处理对
3、运算符的重载处理 函数名是由函数名是由operatoroperator和运算符组成,如和运算符组成,如operator+operator+意思是对运算符意思是对运算符“+”重载。重载。v例如:若要实现上述两个例如:若要实现上述两个ComplexComplex类对象的加法类对象的加法运算,只要编写一个对运算,只要编写一个对“+”运算符进行重载的运算符进行重载的函数即可,函数描述如下:函数即可,函数描述如下:Complex Complex:operator+(Complex&c2)Complex Complex:operator+(Complex&c2)return return Complex(
4、real+c2.real,imag+c2.imag);Complex(real+c2.real,imag+c2.imag);65.2 向上类型转换向上类型转换【例例7-17-1】对对“+”运算符进行重载来实现两个运算符进行重载来实现两个ComplexComplex类对象的加法运算。类对象的加法运算。#include#include#include#include using namespace std;using namespace std;class Complexclass Complexpublic:public:Complex(double r=0,double i=0)Complex
5、(double r=0,double i=0)real=r;real=r;imag=i;imag=i;Complex operator+(Complex&);/Complex operator+(Complex&);/对对“+”运算符进行重载运算符进行重载 void display(string);void display(string);private:private:double real,imag;double real,imag;Complex Complex:operator+(Complex&c2)/Complex Complex:operator+(Complex&c2)/“+”
6、运算符重载函数的类外定义运算符重载函数的类外定义 return Complex(real+c2.real,imag+c2.imag);return Complex(real+c2.real,imag+c2.imag);void Complex:display(string str)void Complex:display(string str)coutstr=(real,imagi)endl;coutstr=(real,imagi)endl;int main()int main()Complex a(3,8),b(5,7),c,d;Complex a(3,8),b(5,7),c,d;d=a+b
7、;/d=a+b;/直接使用重载了的运算符直接使用重载了的运算符+c=a.operator+(b);/c=a.operator+(b);/调用运算符重载函数调用运算符重载函数operator+operator+的第二种形式的第二种形式 c.display(c=a+b);c.display(c=a+b);d.display(d=a+b);d.display(d=a+b);return 0;return 0;77.3 重载运算符的规则重载运算符的规则v(1 1)C+C+不允许用户自己定义新的运算符,不允许用户自己定义新的运算符,只能对只能对C+C+语言中已有的运算符进行重载。语言中已有的运算符进行重
8、载。例如,虽然在某些程序设计语言中用双字例如,虽然在某些程序设计语言中用双字符符“*”作为求幂运算符,但是在使用作为求幂运算符,但是在使用C+C+进行程序设计时,不能将进行程序设计时,不能将“*”作为运算作为运算符进行重载,因为符进行重载,因为“*”不是不是C+C+语言的合语言的合法运算符。法运算符。v(2 2)运算符重载针对新类型数据的实际需)运算符重载针对新类型数据的实际需要,对原有运算符进行适当的改造。一般要,对原有运算符进行适当的改造。一般来讲,重载的功能应当与原有功能相类似。来讲,重载的功能应当与原有功能相类似。87.3 重载运算符的规则重载运算符的规则v(3 3)C+C+允许重载的
9、运算符包括允许重载的运算符包括C+C+中几乎中几乎所有的运算符。具体规定如表所有的运算符。具体规定如表7-17-1所示。所示。表表7-1 C+7-1 C+允许重载的运算符允许重载的运算符运算符名称运算符名称具体运算符具体运算符算术运算符算术运算符+(加),(加),-(减),(减),*(乘),(乘),/(除),(除),%(取模),(取模),+(自增),(自增),-(自减)(自减)位操作运算符位操作运算符&(按位与),(按位与),(按位取反),(按位取反),(按位异或),(按位异或),|(按位或),(左移),(按位或),(左移),(右移)(右移)逻辑运算符逻辑运算符!(逻辑非),(逻辑非),&(逻
10、辑与),(逻辑与),|(逻辑或)(逻辑或)比较运算符比较运算符(小于),(大于),(小于),(大于),=(大于等于),(大于等于),=(小于等于),(小于等于),=(等(等于),于),!=(不等于)(不等于)赋值运算符赋值运算符=,+=,-=,*=,/=,%=,&=,|=,=,=,=其他运算符其他运算符(下标),(下标),()(函数调用),(函数调用),-(成员访问),(逗号),(成员访问),(逗号),new,delete,new,delete,-*(成员指针访问)(成员指针访问)97.3 重载运算符的规则重载运算符的规则运算符运算符功能功能.成员访问运算符成员访问运算符.*成员指针访问运算符
11、成员指针访问运算符:域运算符域运算符sizeof长度运算符长度运算符?:条件运算符条件运算符表表7-2 C+不允许重载的运算符不允许重载的运算符107.3 重载运算符的规则重载运算符的规则v(4 4)坚持)坚持4 4个个“不能改变不能改变”。即不能改变运算符操作数的个。即不能改变运算符操作数的个数;不能改变运算符原有的优先级;不能改变运算符原有的数;不能改变运算符原有的优先级;不能改变运算符原有的结合性;不能改变运算符原有的语法结构。结合性;不能改变运算符原有的语法结构。单目运算符重载后只能是单目运算符,双目运算符重载后依然是双目单目运算符重载后只能是单目运算符,双目运算符重载后依然是双目运算
12、符。运算符。C+C+语言已经预先规定了每个运算符的优先级,以决定运算次序。不论语言已经预先规定了每个运算符的优先级,以决定运算次序。不论怎么进行重载,各运算符之间的优先级别不会改变。怎么进行重载,各运算符之间的优先级别不会改变。C+C+语言已经预先规定了每个运算符的结合性。语言已经预先规定了每个运算符的结合性。v(5 5)重载的运算符必须和用户定义的自定义类型对象一起使)重载的运算符必须和用户定义的自定义类型对象一起使用,其参数至少应有一个是类对象(或类对象的引用)。也用,其参数至少应有一个是类对象(或类对象的引用)。也就是说,参数不能全部是就是说,参数不能全部是C+C+的标准类型,以防止用户
13、修改用的标准类型,以防止用户修改用于标准类型数据的运算符的性质。于标准类型数据的运算符的性质。v(6 6)重载运算符的函数不能有默认的参数,否则就改变了运)重载运算符的函数不能有默认的参数,否则就改变了运算符参数的个数。算符参数的个数。v(7 7)用于类对象的运算符一般必须重载,但有两个例外,运)用于类对象的运算符一般必须重载,但有两个例外,运算符算符“=”和和“&”可以不必用户重载。可以不必用户重载。117.4 运算符重载函数作为类的运算符重载函数作为类的成员函数和友元函数成员函数和友元函数v7.4.17.4.1运算符重载函数作为类的成员函运算符重载函数作为类的成员函数数v7.4.27.4.
14、2运算符重载函数作为类的友元函运算符重载函数作为类的友元函数数127.4.1运算符重载函数作为类的成员函数运算符重载函数作为类的成员函数v将运算符重载函数定义为类的成员函数的原将运算符重载函数定义为类的成员函数的原型在类的内部声明格式如下:型在类的内部声明格式如下:class class 类名类名 返回类型返回类型 operator operator 运算符运算符(形参表形参表););v在类外定义运算符重载函数的格式如下:在类外定义运算符重载函数的格式如下:返回类型返回类型 类名类名:operator:operator运算符运算符(形参表形参表)函数体函数体 135.2 向上类型转换向上类型转
15、换【例例7-27-2】通过运算符重载为类的成员函数来实现通过运算符重载为类的成员函数来实现两个有理数对象的加、减、乘和除运算。两个有理数对象的加、减、乘和除运算。#include#include#include#include using namespace std;using namespace std;class rational /class rational /声明有理数类声明有理数类public:public:rational(int x=0,int y=1);/rational(int x=0,int y=1);/构造函数构造函数 void print();void print()
16、;rational operator+(rational a);/rational operator+(rational a);/重载运算符重载运算符+rational operator-(rational a);/rational operator-(rational a);/重载运算符重载运算符-private:private:int num,den;int num,den;void optimi();/void optimi();/优化有理数函数优化有理数函数145.2 向上类型转换向上类型转换void rational:optimi()/void rational:optimi()/定
17、义有理数优化函数定义有理数优化函数 int gcd;int gcd;if(num=0)/if(num=0)/若分子为若分子为0 0,则置分母为,则置分母为1 1后返回后返回 den=1;return;den=1;return;gcd=(abs(num)abs(den)?abs(num):abs(den);gcd=(abs(num)abs(den)?abs(num):abs(den);if(gcd=0)return;/if(gcd=0)return;/若为若为0 0,则返回,则返回for(int i=gcd;i1;i-)/for(int i=gcd;i1;i-)/用循环找最大公约数用循环找最大公
18、约数 if(num%i=0)&(den%i=0)break;if(num%i=0)&(den%i=0)break;num/=i;/inum/=i;/i为最大公约数,将分子、分母均整除它,重新赋值为最大公约数,将分子、分母均整除它,重新赋值den/=i;den/=i;if(num0&den0)/if(num0&den0)/若分子和分母均为负数,则结果为正,所以均改为正若分子和分母均为负数,则结果为正,所以均改为正 num=-num;den=-den;num=-num;den=-den;else if(num0|den0)else if(num0|den0)/若分子和分母中只有一个为负数,则调整为
19、分子取负,分母取正若分子和分母中只有一个为负数,则调整为分子取负,分母取正num=-abs(num);den=abs(den);num=-abs(num);den=abs(den);rational:rational(int x,int y)/rational:rational(int x,int y)/定义构造函数定义构造函数 num=x;den=y;optimi();num=x;den=y;optimi();void rational:print()/void rational:print()/输出有理数输出有理数 coutnum;coutnum;if(num!=0&den!=1)/if(
20、num!=0&den!=1)/当分子不为当分子不为0 0且分母不为且分母不为1 1时才显示时才显示/分母分母 cout/denn;cout/denn;else coutn;else coutn;155.2 向上类型转换向上类型转换rational rational:operator+(rational a)rational rational:operator+(rational a)/“+”运算符重载函数,根据前面所列的算法写出表达式运算符重载函数,根据前面所列的算法写出表达式 rational r;rational r;r.den=a.den r.den=a.den*den;den;r.nu
21、m=a.numr.num=a.num*den+a.denden+a.den*num;num;r.optimi();r.optimi();return r;return r;rational rational:operator-(rational a)rational rational:operator-(rational a)/“-”运算符重载函数,根据前面所列的算法写出表达式运算符重载函数,根据前面所列的算法写出表达式 rational r;rational r;r.den=a.den r.den=a.den*den;den;r.num=numr.num=num*a.den-dena.den
22、-den*a.num;a.num;r.optimi();r.optimi();return r;return r;int main()int main()rational r1(3,14),r2(4,14),r3,r4;rational r1(3,14),r2(4,14),r3,r4;r1.print();r1.print();r2.print();r2.print();r3=r1+r2;/r3=r1+r2;/使用重载了的运算符使用重载了的运算符+r3.print();r3.print();r4=r1-r2;/r4=r1-r2;/使用重载了的运算符使用重载了的运算符-r4.print();r4
23、.print();return 0;return 0;167.4.2运算符重载函数作为类的友元函数运算符重载函数作为类的友元函数v将运算符重载函数定义为类的友元函数,其原型将运算符重载函数定义为类的友元函数,其原型在类的内部声明格式如下:在类的内部声明格式如下:class class 类名类名 friend friend 返回类型返回类型 operator operator 运算符运算符(形参表形参表););v在类外定义友元运算符重载函数的格式如下:在类外定义友元运算符重载函数的格式如下:返回类型返回类型 operatoroperator运算符运算符(形参表形参表)函数体函数体 175.2 向
24、上类型转换向上类型转换【例例7-37-3】将运算符将运算符“+”和和“-”重载为适合于有理数加减法,重载函数不作为成重载为适合于有理数加减法,重载函数不作为成员函数,而放在类外,作为员函数,而放在类外,作为rationalrational类的友元函数。类的友元函数。#include#include#include#include class rational/class rational/声明有理数类声明有理数类 public:public:friend rational operator+(rational a,rational b);/friend rational operator+(r
25、ational a,rational b);/重载函数作为友重载函数作为友元函数元函数 friend rational operator-(rational a,rational b);/friend rational operator-(rational a,rational b);/重载函数作为重载函数作为友元函数友元函数private:private:;rational operator+(rational a,rational b)/rational operator+(rational a,rational b)/定义作为友元函数的重载函定义作为友元函数的重载函数数 rational
26、 r;rational r;r.den=a.den r.den=a.den*b.den;b.den;r.num=a.num r.num=a.num*b.den+a.denb.den+a.den*b.num;b.num;r.optimi();r.optimi();return r;return r;185.2 向上类型转换向上类型转换rational operator-(rational a,rational b)/rational operator-(rational a,rational b)/定义作为友元定义作为友元函数的重载函数函数的重载函数 rational r;rational r;
27、r.den=a.den r.den=a.den*b.den;b.den;r.num=a.num r.num=a.num*b.den-a.denb.den-a.den*b.num;b.num;r.optimi();r.optimi();return r;return r;int main()int main()rational r1(3,14),r2(4,14),r3,r4;rational r1(3,14),r2(4,14),r3,r4;r1.print();r1.print();r2.print();r2.print();r3=r1+r2;/r3=r1+r2;/使用重载了的运算符使用重载了的
28、运算符+r3.print();r3.print();r4=r1-r2;/r4=r1-r2;/使用重载了的运算符使用重载了的运算符-r4.print();r4.print();return 0;return 0;197.5 重载双目运算符重载双目运算符v双目运算符(或称二元运算符)有两双目运算符(或称二元运算符)有两个操作数,通常在运算符的左右两侧,个操作数,通常在运算符的左右两侧,如如x+yx+y,t=3t=3,a=ba=b等。在重载双目运等。在重载双目运算符时,在函数中应该有两个参数。算符时,在函数中应该有两个参数。205.2 向上类型转换向上类型转换【例例7-47-4】定义一个定义一个Ti
29、meTime类,用来存放做某件事所花费的时间,如类,用来存放做某件事所花费的时间,如小时分钟,分别重载运算符小时分钟,分别重载运算符“”用于求两段时间的和,用于求两段时间的和,重载运算符重载运算符“”用于求两段时间的差。用于求两段时间的差。#include#include class Timeclass Time public:public:Time();Time();Time(int h,int m=0);Time(int h,int m=0);friend Time operator+(Time&t1,Time&t2);friend Time operator+(Time&t1,Time&
30、t2);friend Time operator-(Time&t1,Time&t2);friend Time operator-(Time&t1,Time&t2);void Show();void Show();private:private:int hours;int hours;int minutes;int minutes;Time:Time()hours=minutes=0;Time:Time()hours=minutes=0;Time:Time(int h,int m)hours=h;minutes=m;Time:Time(int h,int m)hours=h;minutes=m;
31、215.2 向上类型转换向上类型转换void Time:Show()void Time:Show()couthours hours,minutes minutes;couthours hours,minutes minutes;Time operator+(Time&t1,Time&t2)Time operator+(Time&t1,Time&t2)Time sum;Time sum;sum.minutes=t1.minutes+t2.minutes;sum.minutes=t1.minutes+t2.minutes;sum.hours=t1.hours+t2.hours+sum.minute
32、s/60;sum.hours=t1.hours+t2.hours+sum.minutes/60;sum.minutes%=60;sum.minutes%=60;return sum;return sum;Time operator-(Time&t1,Time&t2)Time operator-(Time&t1,Time&t2)Time dif;Time dif;int x1,x2;int x1,x2;x1=t2.hoursx1=t2.hours*60+t2.minutes;60+t2.minutes;x2=t1.hours x2=t1.hours*60+t1.minutes;60+t1.min
33、utes;dif.minutes=(x2-x1)%60;dif.minutes=(x2-x1)%60;dif.hours=(x2-x1)/60;dif.hours=(x2-x1)/60;return dif;return dif;225.2 向上类型转换向上类型转换int main()int main()Time t1(5,30),t2(2,48),t3,t4;Time t1(5,30),t2(2,48),t3,t4;coutt1=;coutt1=;t1.Show();t1.Show();coutendl;coutendl;coutt2=;coutt2=;t2.Show();t2.Show()
34、;coutendl;coutendl;coutt3=t1+t2=;coutt3=t1+t2=;t3=t1+t2;t3=t1+t2;t3.Show();t3.Show();coutendl;coutendl;coutt4=t1-t2=;coutt4=t1-t2=;t4=t1-t2;t4=t1-t2;t4.Show();t4.Show();coutendl;coutendl;return 0;return 0;235.2 向上类型转换向上类型转换【例例7-57-5】重载赋值运算符函数解决指针悬挂问题。重载赋值运算符函数解决指针悬挂问题。#include#include using namespac
35、e std;using namespace std;class Tclass Tpublic:public:T(int x=0)/T(int x=0)/参数带有默认值的构造函数参数带有默认值的构造函数 p=new int(x);/p p=new int(x);/p指向动态创建的整型变量指向动态创建的整型变量int Get()return int Get()return*p;p;T()/T()/析构函数析构函数 delete p;/delete p;/动态释放动态释放p p所指向的单元所指向的单元 T&operator=(const T&);T&operator=(const T&);priva
36、te:private:int int*p;/p;/整型指针整型指针p p,将来指向动态申请到的整型变量,将来指向动态申请到的整型变量T&T:operator=(const T&right)T&T:operator=(const T&right)if(this=&right)return if(this=&right)return*this;/this;/检查自身赋值检查自身赋值delete p;p=new int;delete p;p=new int;*p=p=*right.p;right.p;return return*this;this;int main()int main()T t1(5
37、),t2(8);T t1(5),t2(8);coutt1=t1.Get()tt2=t2.Get()endl;coutt1=t1.Get()tt2=t2.Get()endl;t1=t2;t1=t2;coutt1=t1.Get()tt2=t2.Get()endl;coutt1=t1.Get()tt2=t2.Get()endl;return 0;return 0;247.6 重载单目运算符重载单目运算符v单目运算符只有一个操作数,如单目运算符只有一个操作数,如!a!a,-b b,&c&c,*p p,-i-i,+i+i等。由于单目运等。由于单目运算符只有一个操作符,因此如果运算算符只有一个操作符,因此
38、如果运算符重载函数为友元函数,则只能有一符重载函数为友元函数,则只能有一个参数,如果运算符重载函数为成员个参数,如果运算符重载函数为成员函数,则可以省略此参数。函数,则可以省略此参数。255.2 向上类型转换向上类型转换【例例7-67-6】设计一个设计一个PointPoint类,有私有数据成员类,有私有数据成员x x和和y y表示屏幕上的一表示屏幕上的一个点的水平和垂直两个方向的坐标值,分别实现对自增个点的水平和垂直两个方向的坐标值,分别实现对自增“+”和和自减自减“-”运算符的重载。运算符的重载。#include#includeusing namespace std;using namesp
39、ace std;class Pointclass Pointpublic:public:Point();Point();Point(int vx,int vy);Point(int vx,int vy);Point operator+();/Point operator+();/前置自增前置自增Point operator-();/Point operator-();/前置自减前置自减 void display();void display();private:private:int x,y;int x,y;Point:Point()Point:Point()x=0;x=0;y=0;y=0;P
40、oint:Point(int vx,int vy)Point:Point(int vx,int vy)x=vx;x=vx;y=vy;y=vy;void Point:display()void Point:display()cout(x,cout(x,y)endl;y)endl;265.2 向上类型转换向上类型转换Point Point:operator+()/Point Point:operator+()/前置自增前置自增 if(x640)x+;/if(x640)x+;/不超过屏幕的横界不超过屏幕的横界if(y480)y+;/if(y0)x-;if(x0)x-;if(y0)y-;if(y0)y
41、-;return return*this;this;int main()int main()Point p1(10,10),p2(150,150);Point p1(10,10),p2(150,150);coutp1=;coutp1=;p1.display();p1.display();+p1;/+p1;/测试前置自增测试前置自增 cout+p1=;cout+p1=;p1.display();p1.display();coutp2=;coutp2=;p2.display();p2.display();-p2;/-p2;/测试前置自减测试前置自减 cout-p2=;cout-p2=;p2.dis
42、play();p2.display();return 0;return 0;277.6 重载单目运算符重载单目运算符v在在C+C+中,前置单目运算符和后置单目运算符中,前置单目运算符和后置单目运算符重载的主要区别就在于重载函数的形参。语法重载的主要区别就在于重载函数的形参。语法规定,前置单目运算符重载为类的成员函数时规定,前置单目运算符重载为类的成员函数时没有形参,而后置单目运算符重载为类的成员没有形参,而后置单目运算符重载为类的成员函数时需要有一个函数时需要有一个intint型形参。这个型形参。这个intint型的参型的参数在函数体内并不使用,纯粹是用来区别前置数在函数体内并不使用,纯粹是用
43、来区别前置与后置,因此参数表中可以只给出类型名,没与后置,因此参数表中可以只给出类型名,没有参数名。前置单目运算符重载为类的友元函有参数名。前置单目运算符重载为类的友元函数时有一个形参,即为类的对象,而后置单目数时有一个形参,即为类的对象,而后置单目运算符重载为类的友元函数时需要有两个参数,运算符重载为类的友元函数时需要有两个参数,一个是类的对象,一个是一个是类的对象,一个是intint型形参。型形参。285.2 向上类型转换向上类型转换【例例7-77-7】在在【例例7-67-6】的基础上,增加后置单目运算符的基础上,增加后置单目运算符“+”和和“-”的重载,其的重载,其中将前置和后置的中将前
44、置和后置的“+”运算均重载为类的成员函数,将前置和后置的运算均重载为类的成员函数,将前置和后置的“-”运算均重载为类的友元函数。运算均重载为类的友元函数。#include#includeusing namespace std;using namespace std;class Pointclass Pointpublic:public:Point();Point();Point(int vx,int vy);Point(int vx,int vy);Point operator+();/Point operator+();/重载前置自增为类的成员函数重载前置自增为类的成员函数Point ope
45、rator+(int);/Point operator+(int);/重载后置自增为类的成员函数重载后置自增为类的成员函数friend Point operator-(Point&p1);/friend Point operator-(Point&p1);/重载前置自减为类的友元函数重载前置自减为类的友元函数friend Point operator-(Point&p1,int);/friend Point operator-(Point&p1,int);/重载后置自减为类的友元函数重载后置自减为类的友元函数 void display();void display();private:priv
46、ate:int x,y;int x,y;Point:Point()Point:Point()x=0;x=0;y=0;y=0;Point:Point(int vx,int vy)Point:Point(int vx,int vy)x=vx;x=vx;y=vy;y=vy;void Point:display()cout(x,y)endl;void Point:display()cout(x,y)endl;295.2 向上类型转换向上类型转换Point Point:operator+()/Point Point:operator+()/前置自增前置自增 if(x640)x+;/if(x640)x+;
47、/不超过屏幕的横界不超过屏幕的横界if(y480)y+;/if(y480)y+;/不超过屏幕的竖界不超过屏幕的竖界 return return*this;this;Point Point:operator+(int)/Point Point:operator+(int)/后置自增后置自增 Point temp(Point temp(*this);/this);/先将当前对象通过复制构造函数临时保存起来先将当前对象通过复制构造函数临时保存起来if(x640)x+;/if(x640)x+;/不超过屏幕的横界不超过屏幕的横界if(y480)y+;/if(y0)p1.x-;if(p1.x0)p1.x-
48、;if(p1.y0)p1.y-;if(p1.y0)p1.y-;return p1;return p1;Point operator-(Point&p1,int)/Point operator-(Point&p1,int)/后置自减后置自减 Point temp(p1);/Point temp(p1);/先将当前对象通过复制构造函数临时保存起来先将当前对象通过复制构造函数临时保存起来if(p1.x0)p1.x-;if(p1.x0)p1.x-;if(p1.y0)p1.y-;if(p1.y0)p1.y-;return temp;return temp;305.2 向上类型转换向上类型转换int ma
49、in()int main()Point p1(10,10),p2(150,150),p3(20,20),p4(160,160),p5;Point p1(10,10),p2(150,150),p3(20,20),p4(160,160),p5;coutp1=;coutp1=;p1.display();p1.display();+p1;/+p1;/测试前置自增测试前置自增 cout+p1=;cout+p1=;p1.display();p1.display();coutp3=;coutp3=;p3.display();p3.display();p5=p3+;/p5=p3+;/测试后置自增测试后置自增
50、cout p3+=;cout p3+=;p3.display();p3.display();coutp5=p3+=;coutp5=p3+=;p5.display();p5.display();coutp2=;coutp2=;p2.display();p2.display();-p2;/-p2;/测试前置自减测试前置自减 cout-p2=;cout-p2=;p2.display();p2.display();coutp4=;coutp4=;p4.display();p4.display();p5=p4-;/p5=p4-;/测试后置自增测试后置自增 cout p4-=;cout p4-=;p4.d