c++ 可以修改作为const引用传递的结构中的元素的值吗?[重复]

4urapxun  于 2024-01-09  发布在  其他
关注(0)|答案(2)|浏览(131)

此问题在此处已有答案

Modifying reference member from const member function in C++(3个答案)
4天前关闭。
在下面的函数中,n是对实际参数的const引用,改变它的值是不法律的。

  1. void DoWork(const int &n);

字符串
结构体的const引用怎么样?我们可以在'Test'中改变'index'吗?下面的代码将打印100。这不是'Test'不可改变吗?

  1. struct Test {
  2. int& index ;
  3. };
  4. void doSth(const Test& test) {
  5. test.index = 100;
  6. };
  7. int main() {
  8. int a = 3;
  9. Test test = {
  10. .index = a,
  11. };
  12. doSth(test);
  13. std::cout << test.index;
  14. }


我该如何理解这一点?
我试着运行代码,它打印100,所以显然'index'可以修改,虽然我们声明'test'为const引用。

gijlo24d

gijlo24d1#

我们可以在“Test”中更改“index”吗?
不你不能
然而,你可能会惊讶地发现,给这个index赋值并没有以任何方式改变它。引用本身保持完全不变。它仍然是对某个int值的引用,在某处。赋值修改了那个int值,它不会修改引用本身。它仍然引用它在赋值之前引用的相同int值。
这“考验”不是不可改变的吗?
正确。赋值不会以任何方式改变它。它会改变引用所引用的内容。
请注意,即使您对Test的引用不是const,也不能“在'Test'中更改'index'”:

  1. void doSth(Test& test) {

字符串
即使这里没有const,也无法更改引用。
这是因为,在C++中,一旦引用存在,它就不能被改变。它将永远保持引用:

  1. int& index ;


一旦构造了this,你就不能做任何事情来改变这个index。向它添加任何东西只是改变this引用的内容。它不会改变引用本身。
在C++中,所有引用本身都是逻辑上的const

展开查看全部
1wnzp6jl

1wnzp6jl2#

这“考验”不是不可改变的吗?
在您的示例中,它IS"不可更改"。index本身没有被修改,它是基础int值被修改。
可以注意到,如果index不是引用,代码将无法编译。

  1. struct Test {
  2. int index ;
  3. };

字符串
在这种情况下,这可以理解为试图修改一个不可变对象,编译器阻止你这样做。

相关问题