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

问题描述 投票:2回答:4
#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
4个回答
2
投票

输出保持不变

如果删除引用(&),则仅传递x的值,而不传递x本身,因此,如果您具有以任何方式更改x的代码,则需要将引用传递给它,例如您将在第一个示例中执行此操作,否则,您将仅更改局部变量,而不是原始变量。

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

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


1
投票

您的示例并非理解潜在行为的最佳选择,请尝试使用以下方法:

#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内的值(不是副本,而是按值发生的值)。

因此任何修改都会反映在原始元素上。


0
投票

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

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

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


0
投票

重点是通过参考和按值处理向量的值。下面是不同类型的值的处理:https://en.cppreference.com/w/cpp/language/range-for

当物品价值被价值抓住时:

((auto x:arr)然后创建了多余的副本,然后在for循环中使用它。

当值被引用捕获时:

((auto&x:arr)不生成副本,而是获取矢量项地址,并且该值在for循环中使用。因此,在这种情况下,实际的矢量项目/元素将发生更改。

© www.soinside.com 2019 - 2024. All rights reserved.