微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当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)功能删除,那么该代码将突然认地调用一个功能完全不同的功能.当前的规则阻止访问说明符更改编译程序的行为.

原文地址:https://www.jb51.cc/c/114807.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐