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;}
};