2014-07-14 49 views
0

我一直在努力寻找以下两段代码之间的区别。C++中的存储引用变量

这...

int z=10; 
int y=&z; 

...是无效的,而下面的不会引发任何错误:

int& foo() 
{ 
    int z=10; 
    return z; 
} 
main() 
{ 
    int y=foo(); 
    cout<<y; 
    return 0; 
} 

当我试图运行它返回y=10程序。

我的问题是:

如果y可以存储使用foo()另一个变量的引用,为什么不直接使用y=&z

+0

第一个错误是因为'&z'是一个指向'int'的指针。第二个是未定义的行为,因为它返回一个局部变量的引用。 – juanchopanza

+0

“int y =&z”在这里你存储的地址...不是它的参考... –

回答

0
int z=10; // create integer z and set it to the value 10. 
int y=&z; // create integer y and set it to the address of z 

上面的代码没有任何与引用....

int &y = z; // create a reference (y) to integer z 

更像是你想要的。

-2

当您使用该函数时,您只是简单地指出该函数不会推送堆栈上的值,而是通过引用返回该值。简单的int没有什么意义,但如果你返回一个结构体或类,则更有用。

y=&z的情况下,你试图设置一个int等于一个地址。

+0

这不是我的意见,但奇怪的是我的点被扣除,总和bug stackoverflow指向系统? –

1

如果你想创建引用变量做

int z=10; 
int& y=z; 
//int y = &z; this is not correct. 
4
int y=&z; 

的符号上面没有指示y是一个参考,而不是你申请运营商的地址z,这意味着你正在做它的地址。

int& y=z; 

这里yz的参考。


在第二个例子中,你有不确定的行为,因为foo()返回一个变量是本地函数的引用的功能。当函数返回时,zfoo()的存储将不再存在,然后通过返回的引用访问它是未定义的行为。

+0

这两种情况下'&'的含义完全不同;如果一个不同的符号被用来声明一个引用(但是所有的通用符号已经被使用了,所以这可能不是一个选项!) –

1

y存储值,而不是引用,因为y定义为int y而不是int& y。由于此foo()返回一个参考,但y存储参考...的值是10

接着代码将失败:

int& foo() 
{ 
    int z=10; 
    return z; 
} 
main() 
{ 
    int& y = foo(); // <-- now y is a reference 
    cout<<y;  // <-- at this point z does not exists 
    return 0; 
} 
+0

'y'不存储任何值。在调用'foo()'和返回用于初始化'y'的位置是UB。 – juanchopanza

0

在C++中,参考变量类似的别名(AS-如果具有用于访问相同的变量不同的名称)。因此,

int z=10; 
int &y=z; // y is a reference variable, and shares same space of z 
y++; // this makes z++ effectively, i.e. z becomes 11 

int y = &z; // your example is wrong, as rvalue is int * and lvalue is int 

现在,当你有,

int& foo() 
{ 
    int z=10; 
    return z; 
} 
main() 
{ 
    int y=foo(); 
    cout<<y; 
    return 0; 
} 

这是危险的,因为你是返回一个局部变量(z)的参考这是怎么回事在从foo归来后被销毁。 这应该像返回值(而不是引用)一样使用,因为局部变量在从函数返回时超出范围。因此,正确的用法是:

int foo() // return by value 
{ 
    int z=10; 
    return z; 
} 
main() 
{ 
    int y=foo(); 
    cout<<y; 
    return 0; 
} 

希望这会有所帮助。建议是永远不会返回局部变量的引用。

+0

一定是有些问题,我在这里得到的是负面的,奇怪! –

1

问题是与此代码:

int& foo() 
{ 
    int z=10; 
    return z; 
} 

z是一个内部变量,其范围与式FOO功能。一旦函数体结束,z不再存储在内存中。但是我们已经将内部变量的参考传递给了外部世界(这超出了它的范围)。