收藏 分销(赏)

第十八章 运算符的重载.doc

上传人:xrp****65 文档编号:5963979 上传时间:2024-11-24 格式:DOC 页数:6 大小:30KB 下载积分:10 金币
下载 相关 举报
第十八章 运算符的重载.doc_第1页
第1页 / 共6页
第十八章 运算符的重载.doc_第2页
第2页 / 共6页


点击查看更多>>
资源描述
第十八章 运算符的重载 运算符重载就是赋予已有的运算符多重含义。C++中通过重新定义运算符,使它能够用于特定类的对象执行特定的功能。例如,通过对+,—,*,/ 运算符的重新定义,使它们可以完成复数、分数等不同类的对象的加减乘除运算操作。这便增强了C++语言的处理能力。 18.1运算符重载的几个问题 1、 哪些运算符可以重载? 几乎所有的运算符都可以重载,除了以下的几个运算符: ., :: ,?: 2、 运算符重载后,优先级和结合性如何? 用户重新定义运算符,不改变原运算符的的优先级和结合性。同时运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。 3、 编译程序如何选用运算符函数? 在每一种编译系统中,运算符实际上都对应一个函数,只是这种运算对用户具有透明性,使用者并不知道函数的存在。运算符重载实际上是运算符函数的重载,所以运算符的重载实际上是函数的重载。 编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不很明显的运算符时,编译程序将去寻找参数相匹配的运算符函数。 4、 重载运算符有哪些限制? (1) 不可臆造新的运算符 (2) 坚持四个不能改变。 l 不能改变运算符原有的优先级 l 不能改变运算符原有的结合性 l 不能改变运算符原有的语法结构 l 不能改变运算符原有的操作数个数 但允许改变 运算符的返回类型 (3)C++规定,运算符中,参数类型都是内部类型时,不允许重载。 “::、*、->、?:”这五个运算符不能重载。 5、 运算符重载必须遵循哪些原则? 运算符重载可以使程序更加简洁,使表达式更加直观,增强可读性。但是,运算符重载使用不宜过多,否则会带来一定的麻烦。 运算符重载必须遵循以下原则: (1) 重载运算符含义必须清楚。 (2) 重载运算符不能有二义性。 18.2 运算符重载的定义格式两种形式 运算符重载的定义格式: 返回类型 operator 运算符号(参数说明); 例1:为A类定义一个“++”运算符重载函数 class A { ...; A operate ++(A&); ... }; 例2:为A类定义一个“+”运算符重载函数 class A { ...; friend A operate +(A&,A&); ... }; 18.3 运算符重载的两种形式 运算符重载的函数有两种形式:成员函数形式和友元函数形式。 1、 重载为成员函数 例18.3.1 下面程序定义一个Time类用来保存时间(时、分、秒),通过重载操作符“+”实现两个时间的相加。 #include <iostream.h> class Time { public: Time(){ hours=0;minutes=0;seconds=0;} //无参构造函数 Time(int h, int m,int s) //重载构造函数 { hours=h; minutes=m; seconds=s; } Time operator +(Time&); //操作符重载为成员函数,返回结果为Time类 void gettime(); private: int hours,minutes,seconds; }; Time Time::operator +(Time& time) { int h,m,s; s=time.seconds+seconds; m=time.minutes+minutes+s/60; h=time.hours+hours+m/60; Time result(h,m%60,s%60); return result; } void Time::gettime() { cout<<hours<<":"<<minutes<<":"<<seconds<<endl; } void main( ) { Time t1(8,51,40),t2(4,15,30),t3; t3=t1+t2; t3.gettime(); } 输出结果: 13:7:10 例18.3.2 下面程序用来实现复数的加法运算 即:(x+yi)+(a+bi)=(x+a)+(y+b)i x+yi+a=(x+a)+yi #include <iostream.h> class complex { public: complex( ) {real=imag=0; } complex(double r, double i=0) //虚部可以省略 { real=r;imag=i; } complex operator +(complex & c); friend void print(complex &c); private: double real,imag; }; complex complex::operator +(complex & c) { return complex(real+c.real,imag+c.imag); } void print(complex &c) { cout<<c.real<<"+"<<c.imag<<"i"<<endl; } void main( ) { complex c1(2.0,3.0),c2(4.0,-2.0),c3; c3=c1+c2; print(c3); c3=c3+complex(3.5); print(c3); } 输出结果: 6+1i 2、操作符重载为友元函数形式 例18.3.3 下面程序修改了例18.3.1,将操作符重载为友元函数实现 #include <iostream.h> class Time { public: Time(){ hours=0;minutes=0;seconds=0;} //无参构造函数 Time(int h, int m,int s) //重载构造函数 { hours=h; minutes=m; seconds=s; } friend Time operator +(Time&,Time&); //重载运算符为友元函数形式 void gettime( ); private: int hours,minutes,seconds; }; Time operator +(Time& time1,Time& time2) { int h,m,s; s=time1.seconds+time2.seconds; //计算秒数 m=time1.minutes+time2.minutes+s/60; //计算分数 h=time1.hours+time2.hours+m/60; //计算小时数 Time result(h,m%60,s%60); return result; } void Time::gettime( ) { cout<<hours<<":"<<minutes<<":"<<seconds<<endl; } void main( ) { Time t1(8,51,40),t2(4,15,30),t3; t3=t1+t2; t3.gettime( ); } 输出结果: 13:7:10 例18.3.4 下面程序用友元函数实现复数的加法运算 #include <iostream.h> class complex { public: complex( ) {real=imag=0; } complex(double r, double i=0) //虚部可以省略 { real=r;imag=i; } friend complex operator +(complex & c1,complex &c2); friend void print(complex &c); private: double real,imag; }; complex operator +(complex & c1, complex &c2) { return complex(c1.real+c2.real,c1.imag+c2.imag); } void print(complex &c) { cout<<c.real<<"+"<<c.imag<<"i"<<endl; } void main( ) { complex c1(2.0,3.0),c2(4.0,-2.0),c3; c3=c1+c2; print(c3); c3=c3+complex(3.5); print(c3); } 输出结果: 6+1i 9.5+1i 3、其它运算符的重载
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服