当const方法是public时,为什么不将C转换成const,而非const是被保护的?

我创建了一个有两个get方法的类,一个是const和一个非const. const方法是公共的,所以用户可以查询向量.非const方法受到保护,所以我可以使用它来修改我需要的数据.

当我尝试使用类,并调用get方法时,编译器会抱怨非const方法被保护.相反,我必须使用const_cast将对象转换为const,所以我可以改为public方法.

有办法解决这个问题吗?为什么编译器本身不会执行,因为有一个公共方法?如果我删除受保护的版本,只是离开const一个,它工作正常,所以它在这种情况下做演员. Cast到const总是安全的.它是删除常量,这是一个问题.

解决方法

编译器在决定要调用什么成员函数之后考虑可访问性.也就是说,保护和私有功能仍然可见,即使它们不可访问.

为什么?一个原因是,如果您通过重载分辨率忽略了无法访问的功能,则可以通过更改其可访问性来更改所谓的功能.使用当前规则,您只能导致编译代码无法编译,或导致当前无法编译的代码,或更改不影响代码含义的内容.您不能更改访问说明符并静导致调用不同的函数.

作为一个例子,这是一个非常可怕的类接口:

public:
    // Returns the amount of change tendered for this transaction.
    MoneyAmount change() const;

private:
    // Account for a change of currency. Charges standard moneychanger's fee.
    MoneyAmount change(Currency toCurrency = Currency::USD);

如果无法访问的功能从重载分辨率中删除,客户端代码可以调用change()就可以了.如果稍后第二个变更(货币)功能被公开,第一个更改(Currency)功能删除,那么该代码将突然认地调用一个功能完全不同的功能.当前的规则阻止访问说明符更改编译程序的行为.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...