gpt4 book ai didi

C++ const 对象的成员可以被修改

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:33 26 4
gpt4 key购买 nike

在这段代码中对象 bar 是一个 const 类型,但是通过 const 函数我仍然可以修改成员 x 的值。这不合理吗?

输出是

1525

// overloading members on constness
#include <iostream>
using namespace std;

class MyClass {
int x;
public:
MyClass(int val) : x(val) {}
int& get() const {return x;}
int& get() {return x;}
};

int main() {
MyClass foo (10);
const MyClass bar (20);
foo.get() = 15;
bar.get() = 25;
cout << foo.get() << '\n';
cout << bar.get() << '\n';

return 0;
}

最佳答案

int& get() const {return x;}

返回一个非 const引用 const 的成员目的。 (我们知道 *thisconst 因为 int& get() 声明为 const 。)这应该被标记为错误,因为它是无效转换( x 未声明 mutable ) ; gcc 和 clang 都会这样做。您的编译器只产生警告这一事实很奇怪,但您仍然应该注意警告。

您可以通过显式使用 const_cast<int&>(x) 来避免错误, 但尝试使用返回的 int& 是未定义行为 (UB)修改x .但是,编译器没有义务标记为错误,甚至没有义务检测所有可能产生未定义行为的可能表达式。

简而言之,您可以搬起石头砸自己的脚,但好的编译器至少会在您这样做之前警告您。听取警告。

关于C++ const 对象的成员可以被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21653460/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com