加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 05:27:00 所属栏目:百科 来源:网络整理
导读:我创建了一个有两个get方法的类,一个是const和一个非const. const方法是公共的,所以用户可以查询向量.非const方法受到保护,所以我可以使用它来修改我需要的数据. 当我尝试使用类,并调用get方法时,编译器会抱怨非const方法被保护.相反,我必须使用const_cast将
我创建了一个有两个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)功能被删除,那么该代码将突然默认地调用另一个功能完全不同的功能.当前的规则阻止访问说明符更改编译程序的行为.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读