C++返回引用作为左值问题--

#include<iostream>
using namespace std;
int &get(int &a);
int main()
{
int c;
int b=10;
get(b)=8;//引用返回了它的自身值(即返回b自身的值)!作为左值:可以这样子相当于(b=8);但是我想知
//道在作为左值时,返回它自身并且重新赋值时,是不是系统自动产生了一个临时别名(不分配内存空间),并用这个别名给b重新赋值?
//如果不是这样子,那么get(b)=8怎么理解?
cout<<b<<endl;
return 0;
}
int &get(int &a){
return a;}

你看反汇编就知道了
编译器在处理引用返回的时候,它先把变量的地址赋给寄存器,对引用赋值的时候再由寄存器间接寻址
get(b)=8
基本上对应的汇编代码就是
lea eax,b//相当于int* p=&b;
mov dword ptr [eax],8 //相当于*p=8;

总而言之,引用也是指针,编译器对引用的处理和指针如出一辙,只是没有额外定义指针变量存放地址而已追问

如果仅仅解释说它返回了它自身的值,那么在赋值时,总不能在等号两边写两个值吧?其他引用只是我掌握了,就是今天遇到这个有点不理解,我怀疑在作为左值运算时,系统是不是临时产生了一个我们不知道的返回值自身的别名,然后通过这个别名来赋值,调用完后别名的生命周期也结束。如果不知这样子,我不知道怎么理解它

追答

你别老是别名别名的,C++是一种高级语言,你写的任何东西都只是给编译器看的而已,说别名只是在某些情况下让你好理解而已

你只要记住,引用返回的东西就是那个东西的本体,而不是在临时空间产生的复制品,这就够了

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-01-03
由于get返回的是int的引用,即返回对象本身。系统不会产生临时变量,所有的操作实际上是在实参的内存上进行的。追问

如果仅仅解释说它返回了它自身的值,那么在赋值时,总不能在等号两边写两个值吧?其他引用只是我掌握了,就是今天遇到这个有点不理解,我怀疑在作为左值运算时,系统是不是临时产生了一个我们不知道的返回值自身的别名,然后通过这个别名来赋值,调用完后别名的生命周期也结束。如果不知这样子,我不知道怎么理解它

追答

引用传递传送的实际是一个指针常量,系统不须临时产生其它变量,它跟使用指针完全是一样的。只不过是不可变的指针。

C++返回引用作为左值问题--
编译器在处理引用返回的时候,它先把变量的地址赋给寄存器,对引用赋值的时候再由寄存器间接寻址 get(b)=8 基本上对应的汇编代码就是 lea eax,b\/\/相当于int* p=&b;mov dword ptr [eax],8 \/\/相当于*p=8;总而言之,引用也是指针,编译器对引用的处理和指针如出一辙,只是没有额外定义指针变量...

看得懂解析——C++引用做返回值
要解决此问题,需避免引用局部变量,因为局部变量在函数结束时将自动释放。故引用作为返回值时,不可返回局部变量的引用,而允许引用作为左值。理解引用实质为指针常量有助于深入理解,指针常量的概念能有效辅助理解。引用作为返回值的使用需留意局部变量的生命周期,避免引用局部变量的错误。综上所述,C++引...

谁知道C++中“引用”作为函数返回值的好处
用引用,可以使函数调用作为左值.引用表达式是一个左值表达式,因此它可以出现在形、实参数的任何一方。若一个函数返回了引用,那么该函数的调用也可以被赋值。一般,当返回值不是本函数内定义的局部变量时就可以返回一个引用。在通常情况下,引用返回值只用在需要对函数的调用重新赋值的场合,也就是对函...

C++函数返回引用问题
C++为“引用“赋于了新的内涵:当函数的形式参数使用“引用类型”时,函数内对“引用”的操作可以改变原变量的值,而用变量类型作形式参数时是拷贝传值,没有这种优势。返回”引用“的函数在函数名前加一个&,再前面是类型名,比如int &index()是返回一个int型“引用”,因为“引用”是int型某变量...

C++中返回引用的作用是什么?没有&就是不引用也没多大问题吧?
它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则...

c++函数返回引用
int sum()返回int,就好像5 = 1,怎么能赋值。int* sunm()返回的是地址,指针赋值是 *p = 6;这么写的

返回引用到底啥意思???
1、如果单纯的从返回值来看,返回引用,除了减少个把临时变量的产生之外,没什么大不了的。2、返回引用,更主要的目的是楼上说的,为了左值运算。就你说的那个销毁问题,实际上,不管是 int f( int& x ) 还是 int& f( int& x ) 中的 x,在 f函数结束后,都不可能销毁的,因为它本来传入的...

c++返回引用类型的问题 引用作为返回类型是什么意思啊?
返回类型为引用,就是返回的值可以作为左值。可以对他进行赋值的意思

c++中的左值、右值、左值引用、右值引用、引用分别是什么
glvalue指的是左值或xvalue,而rvalue(源自“右值”)则是xvalue、临时对象或其子对象,或者与对象无关的值。prvalue(“纯粹”rvalue)则是非xvalue的rvalue,如函数返回类型非引用时的返回值,或字面量如12、7.3e5、true。理解这些概念对于深入掌握C++至关重要。推荐阅读《C++ Rvalue References ...

C++返回引用类型
是的,当返回一个变量时,会产生拷贝。当返回一个引用时,不会发生拷贝,你可以将引用看作是一个变量的别名,就是其他的名字,引用和被引用的变量其实是一个东西,只是有了两个名字而已。问题的关键是,当你想要返回一个引用而不是一个拷贝时,你要确保这个引用的有效性,比如:int & fun() { ...

相似回答