C++ 可以修改 const 对象的成员
C++ const object's member can be modified
在此代码中,对象栏是 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
引用。(我们知道*this
之所以const
,是因为int& get()
被声明为const
。这应该被标记为错误,因为它是一个无效的转换(x
没有声明mutable
);GCC和Clang都会这样做。编译器只生成警告这一事实很奇怪,但尽管如此,您应该注意警告。
您可以通过显式使用 const_cast<int&>(x)
来避免该错误,但尝试使用返回的int&
来修改x
将是未定义的行为 (UB)。但是,编译器没有义务将错误标记为错误,甚至没有义务检测可能产生未定义行为的所有可能的表达式。
简而言之,你可以搬起石头砸自己的脚,但一个好的编译器至少会在你这样做之前警告你。听听警告。
相关文章:
- 指向设备对象成员的指针
- 访问由unique_ptr传递的对象成员
- 引用对象成员函数的成员函数
- 将 C# 对象(包含静态对象成员)作为参数传递给 C++/CLI 程序
- Lua C API - 从C++分配和使用类的对象成员
- Rapidjson 遍历并获取复杂 JSON 对象成员的值
- 类对象成员变量在调用函数时不会更改
- 对象成员变量还是继承
- C++多态性:有没有办法找到对象成员函数的地址?
- 重载对象成员的比较运算符
- 获取未初始化对象成员的地址是否定义良好?
- 在优先级队列被推送到队列后,如何编辑对象成员
- 为什么在这里调用析构函数,以及在调用该对象析构函数后如何调用对象成员函数?
- 通过 std::bind 从对象成员检索值
- 保留对象成员变量的本地副本
- 有没有办法为静态对象成员定义一个符合开关标准的常量?
- 没有默认构造函数的对象成员的 wig setter
- 对象成员数组C++默认初始化
- 如何在数组中添加对象成员
- 使用聚合创建和关联两个不同的对象成员