ZKX's LAB

一个成员函数的返回值类型为引用类型和常值引用类型有什么不同 函数返回类的引用类型

2020-07-21知识12

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的方法

#变量#成员变量#引用类型#const

随机阅读

qrcode
访问手机版