- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++Tricks31左值右值与常量性(lvalue,rvalueamp;constant).PDF
C++Tricks3.1左值
右值与常量性
(lvalue,rvalue
constant)
导⼊
3.1左值右值与常量性
(lvalue,rvalue
constant)
⾸先要搞清楚的是,什么是左值,什么是右值。这
⾥给出左值右值的定义 :
1、左值是可以出现在等号(=)左边的值,右值是只能
出现在等号右边的值。
2、左值是可读可写的值,右值是只读的值。
3、左值有地址,右值没有地址。
根据左值右值的第⼆定义,值的左右性就是值的常
量性——常量是右值,⾮常量是左值。⽐如 :
1=1;//Error
这个复制操作在C++中是语法错误,MSVC给出的错
误提⽰为“errorC2106:=:leftoperandmustbel-
value”,就是说’=’的左操作数必须是⼀个左值,⽽字⾯
常数1是⼀个右值。可⻅,严格的区分左值右值可以 语
法分析的⾓度找出程序的逻辑错误。
根据第⼆定义,⼀个左值也是⼀个右值,因为左值
也可读,⽽⼀个右值不是⼀个左值,因为右值不可写。
通常情况下,声明的变量是⼀个左值,除⾮你指定
const将它变成⼀个右值 :
intlv=1;
constintrv=lv;
由于右值的值在程序执⾏期间不能改变,所以必须
⽤另⼀个右值初始化它。
⼀个普通变量只能⽤右值初始化,如果你想传递左
值,必须声明⼀个引⽤或⼀个指针 :
intref=lv;//⽤引⽤传递左值
int*plv=lv;//传递指针以间接传递左值
必须⽤左值初始化引⽤,然⽽,可以⽤右值初始化
常量引⽤ :
intr1=1;//Error!
constintr2=1;//OK
这实际上相当于 :
int_r2=1;
constintr2=_r2;
这样的写法在函数体内没什么作⽤,但是在传递函
数参数时,它可以避免潜在的(传递左值时的)复制操作,
同时⼜可以接受右值。
通常情况下,函数的参数和返回值都只传回右值,
除⾮你明确的通过引⽤传递左值。
明确了左值与右值的区别,有助于我们写函数时确
定什么时候应该有const,什么时候不该有。⽐如,我们
写了⼀个代表数学中复数的类Complex :
classComplex;
然后,我们写针对Complex的运算符重载 :
operator+和operator=。问题在于,参数和返回值应该
是什么类型,可选类型有四种 :Complex、const
Complex、Complex、constComplex。
对于operator+,我们不会改变参数的值,所以可以
通过constComplex传递参数。⾄于返回值类型,由于
int类型的加法返回右值,所以根据Doastheintsdo的
原则,返回值类型为constComplex :
constComplexoperator+(constComplex,const
Complex);
对于operator=,同样要思考这些问题。我们写⼊第
⼀个参数,所以第⼀个参数为Complex,我们只读取第
⼆个参数,所以第⼆个参数为constComplex。⾄于返
回值,还是Doastheints的赋值返回左值,不
信你可以试⼀试 :
inti;
(i=1)=2;
虽然⽐较傻,先将i赋为1,再将其改为2,但是这是
被C++语法⽀持的做法,我们就理应遵守。所以返回第⼀
个参数的左值 :
Complexoperator=(Complex,const
Complex);
const是C++引⼊的语⾔特性,也被ANSIC99借鉴,
在经典版本的C语⾔中是没有的。关于const的历史,有
⼏点值得玩味。最初BjarneStroustrup引⼊const时,可
写性是和可读性分开的。那时使⽤关键字readonly和
writeonly。这个特点被⾸先提交到C的ANSI标准化委员
会(当时还没有C++标准化的计划),但是ANSIC标准只接
受了readonly的概念,并将其命名为const。随后,有⼈
您可能关注的文档
- 3-1微分学中值定理洛必达法则.ppt
- 3-工资集体协商操作程序.ppt
- 《二十四孝端砚》藏品说明书.docx
- 31多组分精馏过程-分离工程.ppt
- 31解的存在唯一性定理和逐步逼近法Existence&Uniqueness.ppt
- 32导数的运算法则.PDF
- 32数量积向量积混合积.ppt
- 32银行竞争度的研究-首都经济贸易大学教务处.doc
- 33.2产业集群竞争力评价GEM模型修正与应用.ppt
- 34矿产资源评估中值得研究的若干问题及国际规范.doc
- ASX_Series_操作说明书手册.pdf
- Battery-Backup-Kit-Installation-操作说明书手册.pdf
- DCB-05-V2-操作说明书手册.pdf
- DEIMOS-Installation-操作说明书手册.pdf
- Axess-Pro-Series-2120-Roller-Shutter-Pendant-操作说明书手册.pdf
- Controll-A-Door-P-Diamond-操作说明书手册.pdf
- Controll-A-Door-PD-Power-Drive-操作说明书手册.pdf
- Controll-A-Door-Secure-SDO-6-操作说明书手册.pdf
- AMX_Series_操作说明书手册.pdf
- ELI-250-Installation-操作说明书手册.pdf
最近下载
- 中华人民共和国机械行业标准燃煤热风炉技术条件.PDF
- 武汉市光谷为明实验学校新初一分班语文试卷含答案.pdf VIP
- 浙江大学紫金港校区校园平面图.PDF VIP
- 中级车号员(长)试题及答案.pdf VIP
- 铁路车号员(长):中级车号员(长)测试题.docx VIP
- 铁路车号员(长)中级车号员(长)试卷(铁路车号员(长)).doc VIP
- 铁路车号员(长)车号员一体化考试试卷(铁路车号员(长)).doc VIP
- 铁路车号员(长)铁路车号员(长)综合练习试卷(铁路车号员(长)).doc VIP
- 铁路车号员(长)铁路车号员(长)综合练习试卷.doc VIP
- 初中数学高质量作业设计策略与实践.pptx
文档评论(0)