C++函数的返回类型声明为一个右值引用类型,会发生什么事情? std:move 实际上是什么也没做。move语义的实现是靠move ctor 来完成了的。所以,我想知道的是,除了用来…什么情况下成员函数返回类型为引用类型,有什么作用 需要作左值使用时要返回引用。如一个类重载+操作符,如果返回临时变量,则+操作符不能用在左边。求采纳!一个成员函数的返回值类型为引用类型和常值引用类型有什么不同 返回值是原来对象的副本,而引用就是那个对象本身.返回引用常见于类的成函数,当返回为值类型的时候,会在栈中生成一个临时对象返回,再赋值,这个过程会有两次拷贝构造被调用,对于一个体积大的对象,开销是比较大的,而返回引用就没有这个开销.函数返回引用类型和非引用类型的区别 返回值为引用类型的函数某些情况下可作为表达式的左值,而非引用的则一般不可以。函数返回值若为引用类型,当返回的是函数的引用形参时,则是对函数外的变量的引用,函数可以作为表达式的左值(被赋予新值)。而当函数返回的是非引用类型时,返回的值是函数内隐式生成的临时变量,当函数结束析构时释放,函数作为左值被赋予新值没有意义或产生错误。(例外情况,当返回的是函数中用new等动态内存分配函数建立的指针时,可作为左值。注:“引用类型”并非是一种新的类型,也没有这种类型,只是为了口头上的方便说的,是对某某类型变量的引用的个人说法。看c++,书里面有一句关于函数返回引用类型的话不太明白 自动变量的空间是在堆栈中,随着函数结束,这部分空间会释放。之所以没有出错,是因为在返回以后,自动变量在堆栈中的空间虽然释放了,但是还没有被其他数据破坏。你可以试一下这样写:float&display(){float a;a=9.0f;return a;}float&g_a=display();void main(){cout;}a在堆栈中的值被g_a引用,但因为堆栈被主函数破坏,输出的就是一个不确定的值(虽然在同一个编译器下的多次执行结果可能是一样的)。但你把g_a放在main函数体内,通常不会出错。除非是有些编译器故意在释放空间后破坏释放空间中的值(这种暂时看不出来的错误是很可怕的)。关于函数返回类型是引用类型的问题!!谢谢 返回值是非引用的时候就是直接把局部变量的值在return的时候复制给临时变量,然后你可以接收这个函数的返回值。而引用类型返回的内容相当于返回了一个*(&变量)的结果,由于局部变量在函数运行完毕之后这个变量的空间已经被释放了,你再去取这个地址的时候这块内存的内容就是不确定的了,所以没有办法获得正确的结果。C++函数返回类型是引用的问题 引用就是变量的别名,返回c3的引用,返回的就是c3,c3被清除,再调用c3的函数,结果当然不正确;如果返回 i 后,i被清除,但是返回值已经被输出了,结果是正确的;返回C类型,g函数返回 的是C类型的一个对象,虽然c3被清除,但是返回的对象还能调用get函数你可以在C类中增加一个析构函数,调试运行,你会发现,g函数里执行了一次析构函数,然后get函数后又发生了一次析构慢慢理解吧,很难讲清楚啊返回引用类型的将“引用”作为函数返回值类型 格式:类型标识符&函数名(形参列表及类型说明){/函数体 }好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error。注意事项:(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了无所指的引用,程序会进入未知状态。(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得。const成员函数返回的引用类型,一定是const? const限定符是在源代码层次防止程序员修改原本并不打算修改的对象,就是防止喝多了或没睡醒这种状况。const A&A:F(const&A)const;前面这个const就是防止出现类似f(a)=b;这样情况的比如有A a,b;a.F(a)=b;F函数返回a的引用,那这个就等价于a=b;既然如此,那不如直接写a=b;所以返回加个const 就避免了这种莫名奇妙的赋值还有的类方法会返回某个成员的引用,比如类A有成员int i;如果返回i的引用,那么就可能有a.F(a)=6;这样的玩意,F的本意是获得i的值,但却可以通过F修改i,绕过了类中可改写i的正常方法,这就可能对i写入非法值,违反了数据隐藏的原则,破坏了类的可靠性,所以加个const限定符就可以防止这样的情况产生所以从语法层次上看,不加前面的const没什么问题,但从合理性和安全性上看,还是加了好至于后面的const,那是修饰调用该方法的对象本身的,因为成员函数的参数表里无法出现调用函数的对像本身,所以就只能加到函数后面了,用来修饰*this的,const对象也只能调用后缀是const的方法
随机阅读
- 游艇码头规划设计需要考虑什么因素? 水上浮桥要采用什么材料会比较好? 水上浮桥怎么通车
- 气相色谱技术在食品安全检测中的综合应用是什么? 气相色谱分析 食品检测
- 自动王离合器故障 语音王不要手动
- 粉瘤外科证治全生集 身上长了十多个脂肪瘤怎么治疗
- 求VIP激活码一个!~~ 最新章节 vip 武林番外
- 美的电饭煲的这个盖子怎么拆 美的电饭煲怎么拆盖子
- 自由幻想 超级魔王飞天猪 QQ自由幻想超级魔王飞天猪在哪里呀?
- 从泸州水井沟直接打的士到玄滩多少钱 就是平时 泸州水井沟二手单车
- 贸大国际贸易学院的金融学,金融学院的金融学,国际金融学有什么区别,哪个更好 贸大国际金融与市场
- 春天怎样养水仙 春天水仙怎么弄
- 梦见救了好多人是什么意思啊 梦到仙逝的人救了自己是什么意思?
- 四季青到武林门远吗 从四季青怎么去武林门
- 美团永久拉黑可以再申请小号码 美团号被拉黑怎么在换号,请问一下?
- 未来的英语作文带翻译 奋斗未来的英语作文
- 我家户口是嵩山路派出所,房产是长江东路永丰新都,小升初不知道能划那 永丰路小升初摇号
- 松江到康桥半岛地铁 上海地区所有大润发超市的具体地址
- 潍坊市奎文区鑫盛达机械厂怎么样?
- 貂蝉是怎么死的? 冠位貂蝉
- 借款鉴权服务 个人征信业务授权书什么情况必须签
- 昆工机器人工程专业 如何评价贴吧四大名校哈工程南审中北昆工?