条款28:避免返回handles指向对象内部成分

class Rectangle

{
     public:

      ...

      point & upperLeft()const {   return pData->ulhc;}

      point & lowerRight() const { return pData->lrhc;}

      ...

};

这样的设计可通过编译,但却是错误的,实际上它是自我矛盾的。

一方面upperLeft和lowerRight 被声明为const成员函数,因为它们的目的只是为了提供客户一个得知rectangle相关坐标的方法,而不是让客户修改rectangle,另一方面两个函数却都返回references指向private内部数据,调用者于是可通过这些reference更改内部数据!

如果它们返回的是指针或迭代器,相同的情况还是会发生,原因也相同。引用,指针,迭代器统统都是所谓恶handles,而返回一个代表对象内部数据的handle,随之而来的便是“降低对象封装性”的风险。

只要我们对他们的返回类型加上const即可:

class Rectangle

{
     public:

        ...

           const Point& upperLeft() const { return  pData->ulhc;}

          const Point& lowerRight () const {return pData->lrhc;}

};

不论这所谓的handle是个指针或迭代器或reference,也不论这个handle是否为const,也不论那个返回handle的成员函数是否为const,这里唯一关键是,有个handle传出去了,这样你就是暴露在handle比起所指对象更长寿的风险。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值