c++ - 当 const 方法是公共(public)的并且非 const 方法受到保护时,为什么 C++ 不强制转换为 const?

标签 c++ constants

我创建了一个类,其中包含两个 get 方法,一个是常量,一个是非常量。 const 方法是公共(public)的,因此用户可以查询 vector 。非常量方法是 protected ,所以我可以用它来修改我需要的数据。

但是,当我尝试使用该类并调用 get 方法时,编译器提示非常量方法受到保护。相反,我必须使用 const_cast 将对象转换为 const,这样我就可以获得公共(public)方法。

有办法解决吗?既然有公共(public)方法,为什么编译器不自己进行转换呢?如果我删除 protected 版本并只保留 const 版本,它可以正常工作,所以在这种情况下它确实会执行转换。转换为 const 总是安全的。它正在消除常量问题。

最佳答案

成员访问控制是调用成员函数时发生的最后一件事。它发生在名称查找、模板参数推导、重载解析等之后。最后完成的原因是因为决定更改成员的访问控制不应突然更改客户端代码的执行。

想象一下,在重载决议之前检查了访问权限,并且您使用了一个库和该库中的某个成员函数。然后库作者将函数设为私有(private)。突然,您的代码开始使用不同的重载并以完全不同的方式运行。库的作者可能打算任何使用该函数重载的人都应该停止使用它,但他们并不打算更改每个人的代码。但是,由于实际定义了标准,您的代码现在会开始向您提供使用私有(private)成员的错误,而不是表现不同。

解决方案是简单地更改 protected 成员函数的名称,使其不被考虑。

关于c++ - 当 const 方法是公共(public)的并且非 const 方法受到保护时,为什么 C++ 不强制转换为 const?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044315/

相关文章:

c++ - 不同库之间的命名冲突

c - 为什么 int x[n] 错误,其中 n 是 const 值?

c++ - OpenMP 和内存带宽限制

c++ - 在模板类中使用嵌套的嵌套类时,“依赖名称不是类型”

c++ - 如何进行腿部运动,OpenGL?

c++ - QStandardItemModel 在其余项之上附加新项

c# - 将变量转换为常量

c++ - 是否可以通过 const 引用获取参数,同时禁止转换以便不传递临时变量?

c++ - 将 const uint * 的值复制到 C++ 中的另一个变量

c++ - 为什么C++中需要初始化const变量?