按值传递变量与按引用传递变量具有相同的结果

Passing variable by value has the same result as passing it by reference

#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 assumes a copy of each value in the vector" 时,那是什么意思?

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

的第二个输出

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

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

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

The output remains the same

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

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

因此,如果您再次打印矢量,您会发现没有引用的版本并没有改变它。如您所见HERE

你的例子不是理解底层行为的最佳例子,尝试类似的东西:

#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 中实际值的引用(而不是副本,这是按值发生的)。

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

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

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

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

当它的值被引用捕获时:

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