这里的handles包括指针、引用、迭代器。
struct point{...};
struct RectData{point ulhc; point lrhc;};
class Rectangle{
...
private:
std::tr1::shared_ptr<RectData> pDate;
public:
point& upperleft() const {return pDate->ulhc;}
};
上面的代码中返回的是一个point类型的引用,通过这个引用可以对ulhc进行修改,这显然破坏了封装性。由此可见,成员变量的封装性最多只等于返回其handles的函数的访问级别。换句话说不应该返回低于函数访问级别的成员handles。
若将上面的成员函数改成下面这样:
const point& upperleft() const {return pDate->ulhc;}
虽然这样可以防止使用返回的引用对私有成员进行修改,但是在有的场合还是会造成错误的,那就是返回了一个函数体内部对象的handles,当退出函数体的时候,handles就悬空了,这里不再举例。