安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

C为什么有时运算符重载需定义一个函数体完全相同的const版

8月20日 溷元楼投稿
  我们知道,数据保护很重要,如文件的用户限制,只读限制,密码保护等。
  在编程语言中,使用const限定变量来做数据保护,以避免其数据状态的改变。
  如有一个类,要访问一个类公共成员,需要通过声明类对象(或类对象指针、引用)来引用类的成员函数。如果声明了这个类的一个常对象呢?常对象是说不能改变类的数据成员,对象是用来调用成员函数的,也就是说调用的成员函数不能更改数据成员。在编译阶段,编译器无法去查询引用的成员函数的定义,所以C的做法是,设置常成员函数的语法机制,在类定义时,常成员函数的是在末尾添加一个const标识(因为函数还可以返回const类型(放在开头),所以只能放在末尾),常成员函数的函数体只能引用成员数据做右值(不能引用数据成员做左值)。所以,常对象自然只引用常成员函数,编译器会在编译阶段检查常对象引用的是不是常成员函数,会在类定义中去查找对应的常成员函数版本,如果不是,会引发编译错误。另外,常成员函数虽然可以返回引用,并可以用常对象调用返回引用的常成员函数做左值来修改对象状态,但最好是值返回,因为常对象的初衷就是不改变对象状态。
  例如:constArrayib(7);sevenelementArray
  ib不能调用非常成员函数。
  值返回的常运算符重载也不能被:ib。operator〔〕(3)8;error,相当于ib〔3〕8;如果定义的是intoperator〔〕(int)ib。operator〔〕(3)可以做左值,但返回了声明const对象的初衷coutib〔3〕
  如果非常对象,则可以调用非常成员函数,也可以使用非常操作符重载。Arrayia(7);sevenelementArrayia。operator〔〕(3)6;相当于ia〔3〕6;coutia〔3〕
  如一个array类的简单demo版:classArray{public:Array(int10);defaultconstructorArray();destructorsubscriptoperatorfornonconstobjectsreturnsmodifiablelvalueintoperator〔〕(int);subscriptoperatorforconstobjectsreturnsrvalueintoperator〔〕(int)intoperator〔〕(int)也可以返回引用,但会引发常对象也可以〔〕做左值private:pointertofirstelementofpointerbasedarray};endclassArraydefaultconstructorforclassArray(defaultsize10)Array::Array(intarraySize){size(arraySize0?arraySize:10);validatearraySizeptrnewint〔size〕;createspaceforpointerbasedarrayfor(inti0;i)ptr〔i〕0;setpointerbasedarrayelement}Array::Array(){delete〔〕}overloadedsubscriptoperatorfornonconstAreferencereturncreatesamodifiablelvalueintArray::operator〔〕(intsubscript){checkforsubscriptoutofrangeerrorif(subscript0subscriptsize){cerrError:Sexit(1);subscriptoutofrange}endifcoutnonconstversionreturningreference(lvale)returnptr〔subscript〕;referencereturn}endfunctionoperator〔〕overloadedsubscriptoperatorforconstArraysconstreferencereturncreatesanrvalueintArray::operator〔〕(intsubscript)const{checkforsubscriptoutofrangeerrorif(subscript0subscriptsize){cerrError:Sexit(1);subscriptoutofrange}returnptr〔subscript〕;returnscopyofthiselement}intmain(){Arrayia(7);sevenelementArrayia。operator〔〕(3)6;相当于ia〔3〕6;coutia〔3〕constArrayib(7);sevenelementArrayib。operator〔〕(3)8;error,相当于ib〔3〕8;如果定义的是intoperator〔〕(int)ib。operator〔〕(3)可以做左值coutib〔3〕getchar();return0;}output:nonconstversionreturningreference(lvale)nonconstversionreturningreference(lvale)6constversionreturningrvale0
  关于const:
  1因为是const,需要在声明时初始化(常量声明后不能再修改);
  2防止修改,起保护作用,增加程序健壮性
  3const常量相对于define宏定义,const常量具有类型,编译器可以进行安全检查;define宏定义以字面量为数据类型,只是简单的字符串替换,并不进行安全检查。若用const定义常量(类型为整数或枚举,必须以常量表达式初始化),则这种常量在非odr式使用(粗略来说是只使用其值)时不需要依赖其身为变量的身份,一定场合下甚至可以不需要定义(譬如作为类的static成员对象)。编译器在作为常量处理它时,不会依赖一份定义,而是像是立即数一样使用它,它本身可能在机器码中被拷贝到多个地方,和define定义的宏常量的结果相同。另一方面,const定义的常量由于是整数或枚举,所以直接变成机器码上的立即数往往性能更好。另外,const定义的变量只有类型为整数或枚举,且以常量表达式初始化时才能作为常量表达式。其他情况下它只是一个const限定的变量,不要与常量混淆。
  4const对象默认为文件内链接属性,显式声明extern,可以将const对象改变为外部链接属性。
  5const与指针,指针指向目标对象,变量存在型、址与值,指针本身可以称为己址、己值,目标对象可以称为他值。
  以指针声明运算符为界限,const放在前面,表示修饰指针的目标对象,不能通过指针解引用ptr做左值去修改a,const放在后面,表示修饰指针自身,ptr本身不能再做左值,不能再指向其它存储单元。
  6const修饰函数的返回值(放置在函数声明的开头),并不能做为函数签名的标志,不能用以区分函数重载。但const修饰成员函数是否能够对成员数据做修改(也就是在函数体内使用成员数据做左值),可以做为函数签名的标志,能够区分函数重载。
  ref
  https:lightcity。clubscbasiccontentconst
  End
投诉 评论

Facebook一天暴跌2000亿,吓崩美科技股,元宇宙只是很多东西刚出来的时候,别人都觉得是笑话啊!元宇宙实际上就是游戏的升级版,国内某些方面还要大力发展。不要拿着纳税人的钱去跟着起哄了!熟话说玩物丧志!该做好我们的制造业就要做……南京大学发现有望借助月壤生产氧气和燃料人类遨游太空,水、氧气和能源不可或缺。记者5月8日从南京大学获悉,该校邹志刚院士、姚颖方教授团队与香港中文大学(深圳)、中国科学技术大学合作,发现嫦娥五号带回的月壤样本中,一些……如何看待realmeIQOO等手机品牌,在国内市场快速崛起的文小伊评科技遍观从近一两年的手机市场,有两个品牌的增长速度是最快的,他们就是IQOO和Realme,尤其是IQOO,这个在2019年才建立的全新手机品牌目前已经成为手机市……C为什么有时运算符重载需定义一个函数体完全相同的const版我们知道,数据保护很重要,如文件的用户限制,只读限制,密码保护等。在编程语言中,使用const限定变量来做数据保护,以避免其数据状态的改变。如有一个类,要访问一个类……如果你有才能,怎么用十年让钉钉超越微信?这个不可能,十年不可能超越微信。网络:公平公正合情合理服务国家。服务社会。服务民生,是网络的基本特征。不应该是投机取巧的竞技场或坑民误国的私人平台!不是克隆,做些微……日本将帮助车企避免智能网联汽车专利纠纷来源:盖世汽车谭璇盖世汽车讯据外媒报道,日本政府将制定一份指导方针,帮助企业在开发智能网联汽车的过程中避免专利诉讼,这是企业在开发智能网联汽车时面临的主要风险之一。……科学家发现最古老星系日前,天文学家发现了一个可能是迄今观测到的最古老、最遥远的星系。这一星系是在标志着宇宙起源的大爆炸事件发生后不久形成的,或由第一代新星构成。研究人员7日称,这个名为HD1……刚刚SK海力士收购英特尔NAND业务获中国批准!581亿交易最近几年,最受各国瞩目、交易也最活跃的产业,莫过于芯片行业了。在这种情况下,各大芯片巨头也没让人失望,纷纷开疆拓土,通过兼并收购的方式来扩大商业版图,韩国芯片巨头SK海力士就是……互联网野蛮扩张,正在造成经济产业严重失衡互联网行业主要依靠三种渠道变现!第一,搭建平台收取坑位费和广告费!第二,卖互联网虚拟产品。第三,用互联网连接商品服务和消费者,直接抽成赚钱。而这三种经营……事关中小学线上教学,河北省教育厅最新通知河北省教育厅部署线上教学工作中小学线上教学每课时不超过30分钟近期,由于疫情原因,我省部分地区中小学校实行线上教学。为做好疫情防控期间线上教学工作,最大限度减少疫情……OLED屏和QLED屏,买电视的时候还傻傻分不清楚?说起QLED我们第一个可能想到的就是三星了,毕竟这个技术是三星注册发明的亲儿子。三星在2017的国际消费类电子产品展览会发布了首款QLED电视,并与海信和TCL在2017年4月……零百2。9秒续航超1000km?比亚迪新车若卖10万能大火吗去年安全性超高的刀片电池,今年兼顾性能与油耗的DMi超级混动技术,让比亚迪在新能源汽车市场中的影响力不断上升,甚至被很多人认为是中国的特斯拉。从比亚迪在新能源领域的产品布局来看……
二战德军总兵力是多少?红十一师勇夺白沙关无可奈何真无路张绣1977年龙开富病逝,家人向中央转述其遗愿,叶帅让他回北京吧它是养心殿一墙之隔的军机重地,为啥整得如此寒酸?历史上因为战争后人口锐减,刘邦采取方法快速恢复人口却苦了女人岳振华用导弹击落U扶桑国究竟在哪?山东日本和墨西哥的可能性分别有多大唐玄宗晚年虽然昏庸,但却做出了三件大事,为唐朝续了百年寿命中国核司令销声匿迹20年,晚年坦言在国外成就再大,也是外国人揭秘最早预见毛主席必成大器的伯乐是谁?消失的王国亚特兰蒂斯茶叶罐里的茶垢怎么清洗茶叶罐里的茶垢如何清洗善于从他人的角度考虑问题数字阅读行业创新趋势研究报告:作者体系将影响企业发展初中作文秋游500字孕妇水肿怎么办准妈咪水肿的应对措施运动内衣怎么选才正确这样挑才不怕肉位移销售年会工作总结报告欢乐除夕的作文550字8篇什么会引起世界末日?世界末日到来的十大因素以德报怨何以报德的意思以德报怨何以报德是什么意思能稳定11追踪么,雷蛇毒蝰终极版DPI测试找神词五大技巧找到就卖爆

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利