我一直在努力寻找以下两段代码之间的区别。
这......
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 :(得分:4)
int y=&z;
上面的&符号并不表示y
是引用,而是您将运算符的地址应用于z
,这意味着您正在使用其地址。
int& y=z;
此处y
是对z
的引用。
在第二个示例中,您有未定义的行为,因为函数foo()
返回对函数本地变量的引用。当函数返回时,z
中foo()
的存储将不复存在,然后通过返回的引用访问它是未定义的行为。
答案 1 :(得分:1)
如果要创建参考变量,请执行
int z=10;
int& y=z;
//int y = &z; this is not correct.
答案 2 :(得分: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;
}
答案 3 :(得分:1)
问题在于此代码:
int& foo()
{
int z=10;
return z;
}
z是一个内部变量,其范围是with-in foo函数。一旦函数体结束,z就不再存在于内存中。但是我们已经将内部变量的引用传递给了外部世界(这超出了它的范围)。
答案 4 :(得分: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
更像你想要的。
答案 5 :(得分:0)
在C ++中,引用变量类似于别名(如果具有不同的名称,则用于访问同一变量)。因此,
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;
}
希望这会有所帮助。 建议永远不要返回局部变量的引用。
答案 6 :(得分:-2)
当您使用该函数时,您只是指示该函数不会推送堆栈上的值,而是通过引用返回该值。对于一个简单的int来说有点无意义,但如果你要返回一个struct或class,那就更有用了。
在y=&z
情况下,您尝试将int设置为等于地址。