在c ++中存储引用变量

时间:2014-07-14 06:58:00

标签: c++ memory-management return return-type

我一直在努力寻找以下两段代码之间的区别。

这......

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

7 个答案:

答案 0 :(得分:4)

 int y=&z;

上面的&符号并不表示y是引用,而是您将运算符的地址应用于z,这意味着您正在使用其地址。

 int& y=z;

此处y是对z的引用。


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

答案 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设置为等于地址。