C面向对象编程进阶(函数重载)
在非面向对象的过程化语言中,要求每个过程或函数必须具有唯一的调用名,否则会导致编译错误。
面向对象程序设计语言提供使用同一函数名的机制,通过参数个数的不同或类型的不同来选择使用相应的代码,这就是函数重载。本节重点讲解成员函数重载和运算符重载。成员函数重载
和普通函数类似,在一个类中也可以有成员函数重载。成员函数的重载在规则上和普通函数无差别,这里不再赘述。
例1 成员函数重载示例#include using namespace std; class Sample { private: int i; double d; public: void setdata(int n) {i=n;d=0;}//setdata成员函数重载 void setdata(int n,double x) {i=n,d=x;}//setdata成员函数重载 void disp() { cout<<"i="< using namespace std; class complex { public: complex() {real=imag=0;} complex(double r,double i) {real=r;imag=i;} complex operator+(const complex &c);//+运算符重载 friend void print(const complex &c); private: double real,imag; }; inline complex complex::operator+(const complex &c) { return complex(real+c.real,imag+c.imag); } void print(const complex &c) { cout< using namespace std; class Time { public: Time() {minute=0; sec=0;} Time(int m, int s): minute(m),sec(s) { } Time operator++(); void display() {cout<=60) { sec-=60; ++minute; } return *this; } int main() { Time time1(34,0); for (int i=0;i<60;i++) { ++time1; time1.display(); } return 0; }
例3中对++运算符进行重载。"++"运算符是单目运算符,只有一个操作数,因此,此运算符重载函数只有一个参数,且例6-3中该运算符重载函数作为类的成员函数时,则省略此参数。该例模拟秒表,每次走一秒,满60秒进一分钟,此时秒又从0开始算。运算符重载为类的友元函数
与运算符重载为成员函数时不同的是,重载的友元函数不属于任何类,运算符的操作数都需要通过函数的形参表传递。操作数在形参表中从左到右出现的顺序就是用运算符写表达式时操作数的顺序。
这里分双目运算符和单目运算符两种情况,讨论运算符重载为友元函数的具体方式。如果有双目运算符U,它的其中一个操作数是类A的对象a,那么运算符U就可以重载为类A的友元函数,此友元函数的两个参数中,一个是类A的对象,另一个是其他对象,也可以是类A的对象。
这样双目运算符重载为类的友元函数后,假设运算符的一个操作数是对象b,则表达式aUb就相当于调用函数operator U(a, b)。如果有前置单目运算符U,比如前置"--", a为类A的对象,如果要实现U a这样的运算,就可以把U重载为类A的友元函数,此友元函数只有一个形参,为类A的对象,重载后表达式U a相当于调用函数operator U(a)。如果是后置单目运算符U,如后置"++", a还是类A的对象,那么要实现a U这样的运算,也可以把U重载为类A的友元函数,此时友元函数就需要有两个形参,一个是类A的对象,另一个是整型形参,此整型形参没有实际意义,只是为了区分前置运算符和后置运算符的重载。重载后表达式aU就相当于调用函数operator U(a, 0)。
例4 修改例3为运算符重载为类的友元函数#include using namespace std; class Time { public: Time() {minute=0; sec=0;} Time(int m, int s): minute(m),sec(s) { } Time operator++(); void display() {cout<=60) { a.sec-=60; ++a.minute; } return a; } int main() { Time time1(34,0); for (int i=0;i<60;i++) { ++time1; time1.display(); } return 0; }
注意:该例中是单目运算符前置重载,而且重载为友元函数。因此operator++有一个参数,此参数为Time类对象。该程序结果和例3结果一样,均为显示由34:1到35:0一秒一秒的计数过程。
不管运算符重载是以上哪种形式,都需要遵循以下规则。
(1) C++中的运算符除了少数几个之外,全部可以重载,而且只能重载C++中已有的运算符。(不能重载的运算符只有五个,它们是:成员运算符"."、指针运算符"*"、作用域运算符"::"、类型说明符"sizeof"、条件运算符"?:"。)
(2)重载之后运算符的优先级和结合性都不会改变。
围观!华为Mate50Pro新曝光刘海屏回归麒麟100005G芯片哈喽,您好!我是原呵呵,点点关注吧,更多精彩内容等着您华为Mate系列旗舰机自这整个阵容成立以来就一直火爆。与此同时,据报道,这家科技制造商正准备推出华为Mate50系列,它可以配
最轻量的日常办公软件推荐组合ToDsek网站地址ToDesk远程控制软件免费安全流畅的远程连接电脑手机ToDesk官方版是一款简易实用,功能全面的远程控制软件。ToDesk官方版支持远程控制支持远程文件传输支
iOS16升级名单出炉,小组件玩出新花样,21款手机有你的吗大家好,我是三月。这段时间手机市场是那般火爆,如今三月份也已经就要结束了,但是三月份带给我们的惊喜还真是不少,带大家一起回味一下。从一开始的联发科天玑9000和天玑8100开始,之
拜登拟动用国防生产法鼓励电池材料生产据路透社报道,当地时间3月30日,据两名知情人士透露,美国总统拜登最早可能在本周启动一项冷战时期的国防生产法案,以鼓励国内生产制造电动汽车电池所需的矿物。根据这项法案,企业有望获得
6个小众但却实用的app,保证用过一次你就会彻底爱上这几个app你不一定用过,但是一定要试试看,保证用过一次你就会彻底爱上!1我的桌面(iOS)超多原创壁纸的桌面美化app,可以设置自动换壁纸制作静态壁纸和动态锁屏壁纸还拥有300的
微信亮相三大新功能!网友终于出现了前不久微信高调宣布将打造信用支付产品分付也是引起了大家的重视,微信不仅在其他领域拓展发力,自身的社交功能也是没有落下,最近微信亮相三大新功能,网友终于出现了!我们一起来看看通话铃声
红米和荣耀,究竟谁才会是最后的赢家1000多的价格可以买到一部性能较好的手机吗?红米和荣耀也许会告诉你这个问题的答案。2013年7月31日,红米(Redmi)横空出世,这一天对于小米来说有着重要里程碑的意义。201
顺义区工业互联网标识赋能提档加速随着中国船级社成功接入,工业互联网标识解析国家顶级节点(北京)(以下简称国家顶级节点(北京))累计标识注册量超150亿。近年来,顺义区抢抓工业互联网发展机遇,加快国家顶级节点(北京
一加10Pro行业首发1HzAOD息屏常显低功耗4月1日下午,OPPO首席产品官刘作虎对一加10Pro的优秀屏幕素质进行了种草,该机手机行业首发1HzAOD显示,凭借LTPO2。0技术能时刻保持低功耗息屏常显,晚上再也不怕找不到
堆叠面积增大的方式,能让14nm芯片,比肩5nm么?在相同指令集CPU架构的情况下,5nm芯片性能大于14nm芯片。但是,从应用到指令集的过程,如果编译优化做得足够好,性能可以达到指数级提升。华为与友商相比,CPU架构是自己的,操作
科普深地科学透视地球的金钥匙地球深部亦即深地,一般是指浅地表之下人类难以达到的固体地球深部,包括从浅表的地下空间地壳地幔地核和地心在内的整个固体地球系统。来源视觉中国深地科学是研究地球深部结构物质组成与变化过