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

前端之家收集整理的这篇文章主要介绍了当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&C++相关文章