【问题标题】:Passing variable by value has the same result as passing it by reference按值传递变量与按引用传递变量的结果相同
【发布时间】:2020-01-18 11:27:02
【问题描述】:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
        vector <int> arr {12,13,14,15,16};
        for (auto & x: arr)
        {
                ++x;
                cout << x << " ";
        }

return 0;
}

VS

#include <iostream>
#include <vector>
using namespace std;
int main()
{
        vector <int> arr {12,13,14,15,16};
        for (auto x: arr)
        {
                ++x;
                cout << x << " ";
        }

return 0;
}

输出保持不变,向量中的每个值都以 1 递增。但我的教科书是这么说的。 Text Book Image 当我的教科书说“x 假设向量中每个值的副本”时,这是什么意思?

这是屏幕截图中的代码输出 Code Output 第一个输出是 & 没有&的第二个输出

【问题讨论】:

  • 循环后再次打印矢量。
  • 除非您希望在向量中留下递增值的尾迹,否则不需要它。

标签: c++ pass-by-reference lvalue


【解决方案1】:

输出保持不变

如果您删除引用 (&amp;),您只会传递 x 的值而不是 x 本身,因此如果您有代码以任何方式更改 x,则需要将其与引用一起传递就像您在第一个示例中所做的那样,否则您只会更改局部变量,而不是原始变量。

打印的值是相同的,因为在第一个示例中您正在递增变量并打印它,在第二个示例中您正在打印局部变量(witch 只是一个副本)但也在递增。

因此,如果您再次打印矢量,您将看到没有参考的版本并没有改变它。如您所见HERE

【讨论】:

    【解决方案2】:

    我认为您需要更改向量的元素(将它们加一),因此如果您按值传递向量元素,则循环将使用向量元素的副本而不是您的元素本身。

    因此您必须使用对矢量元素的引用。

    您可以通过使用评论中的提示来确保这一点。

    【讨论】:

      【解决方案3】:

      您的示例不是理解底层行为的最佳选择,请尝试以下内容:

      #include <iostream>
      #include <string>
      #include <vector>
      using namespace std;
      
      void reference()
      {
          cout << "reference" << endl;
          vector <int> arr {12,13,14,15,16};
        for (auto& x: arr)
          ++x;
        for (const auto& x : arr)
          cout << x << endl;
      }
      
      void value()
      {
        cout << "value" << endl;
        vector <int> arr {12,13,14,15,16};
        for (auto x: arr)
          ++x;
        for (const auto& x : arr)
          cout << x << endl;
      }
      
      int main()
      {
        value();
        reference();
        return 0;
      }
      

      现在输出将是:

      value
      12
      13
      14
      15
      16
      reference
      13
      14
      15
      16
      17
      

      如您所见,在引用情况下,向量内的值被直接修改,这是因为您通过使用引用在 vector 上循环,因此循环本地的 x 是对vector 中的实际值(而不是副本,这是按值发生的)。

      所以任何修改都会反映在原始元素上。

      【讨论】:

        【解决方案4】:

        重点是通过引用和值来处理向量的值。 以下是处理值的不同类型: https://en.cppreference.com/w/cpp/language/range-for

        当它是按值捕获的项目值时:

        (auto x: arr) 然后创建额外的副本,然后我们在 for 循环中使用它。

        当它的值被引用捕获时:

        (auto &x: arr) 不会生成副本,而是采用向量项地址并将值用于 for 循环。因此,在这种情况下,实际的矢量项/元素会发生变化。

        【讨论】:

          猜你喜欢
          • 2017-01-19
          • 2010-10-04
          • 2010-09-05
          • 2019-03-23
          • 1970-01-01
          相关资源
          最近更新 更多