【问题标题】:store reference variable in c++在 C++ 中存储引用变量
【发布时间】:2014-09-04 01:07:40
【问题描述】:

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

这...

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=&amp;z呢?

【问题讨论】:

  • 第一个错误是因为&amp;z是一个指向int的指针。第二个是未定义的行为,因为它返回对局部变量的引用。
  • "int y=&z" 你在这里存储地址...不是参考...

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


【解决方案1】:
 int y=&z;

上面的和号并不表示y 是一个引用,而是您将运算符的地址应用于z,这意味着您正在获取它的地址。

 int& y=z;

这里的y 是对z 的引用。


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

【讨论】:

  • &amp;的含义在这两种情况下是完全不同的;如果使用不同的符号来声明引用,那就太好了(但所有常见的符号都已经在使用中,所以也许这不是一个选择!)
【解决方案2】:

如果你想创建引用变量做

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

【讨论】:

    【解决方案3】:

    y 存储值,而不是引用,因为 y 定义为 int y 而不是 int&amp; 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;
    }
    

    【讨论】:

    • y 不存储任何值。它是在 foo() 被调用并且返回用于初始化 y 时的 UB。
    【解决方案4】:

    问题在于这段代码:

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

    z 是一个内部变量,其范围在 foo 函数内。一旦函数体结束,z 就不再存在于内存中。但是我们已经将内部变量的引用传递给了外部世界(超出了它的范围)。

    【讨论】:

      【解决方案5】:
      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
      

      更像你想要的。

      【讨论】:

        【解决方案6】:

        在 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;
        }
        

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

        【讨论】:

          【解决方案7】:

          当您使用该函数时,您只是表明该函数不会将值压入堆栈,而是通过引用返回值。对于一个简单的 int 有点毫无意义,但如果您要返回一个结构或类,则更有用。

          y=&amp;z 的情况下,您尝试将 int 设置为等于地址。

          【讨论】:

          • 这不是我的评论,但奇怪的是我的分数被扣除了,stackoverflow指向系统中的总和错误?
          猜你喜欢
          • 2021-05-01
          • 1970-01-01
          • 2012-09-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多