此问题在此处已有答案:
Modifying reference member from const member function in C++(3个答案)
4天前关闭。
在下面的函数中,n是对实际参数的const引用,改变它的值是不法律的。
void DoWork(const int &n);
字符串
结构体的const引用怎么样?我们可以在'Test'中改变'index'吗?下面的代码将打印100。这不是'Test'不可改变吗?
struct Test {
int& index ;
};
void doSth(const Test& test) {
test.index = 100;
};
int main() {
int a = 3;
Test test = {
.index = a,
};
doSth(test);
std::cout << test.index;
}
型
我该如何理解这一点?
我试着运行代码,它打印100,所以显然'index'可以修改,虽然我们声明'test'为const引用。
2条答案
按热度按时间gijlo24d1#
我们可以在“Test”中更改“index”吗?
不你不能
然而,你可能会惊讶地发现,给这个
index
赋值并没有以任何方式改变它。引用本身保持完全不变。它仍然是对某个int
值的引用,在某处。赋值修改了那个int
值,它不会修改引用本身。它仍然引用它在赋值之前引用的相同int
值。这“考验”不是不可改变的吗?
正确。赋值不会以任何方式改变它。它会改变引用所引用的内容。
请注意,即使您对
Test
的引用不是const
,也不能“在'Test'中更改'index'”:字符串
即使这里没有
const
,也无法更改引用。这是因为,在C++中,一旦引用存在,它就不能被改变。它将永远保持引用:
型
一旦构造了this,你就不能做任何事情来改变这个
index
。向它添加任何东西只是改变this引用的内容。它不会改变引用本身。在C++中,所有引用本身都是逻辑上的
const
。1wnzp6jl2#
这“考验”不是不可改变的吗?
在您的示例中,它IS"不可更改"。
index
本身没有被修改,它是基础int
值被修改。可以注意到,如果
index
不是引用,代码将无法编译。字符串
在这种情况下,这可以理解为试图修改一个不可变对象,编译器阻止你这样做。