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

Avoid returning "handles" to object internals.

返回 handles 的问题

让成员函数返回 handles 指向对象内部成分是比较糟糕的做法:

class Rectangle {
public:
    ...
    Point& upperLeft() const { return pData->ulhc; }
    Point& lowerRight() const { return pData->lrhc; }
    ...
};

这样做有两个不好的影响:

  • 首先,成员变量的封装性最多只等于“返回其 reference”的函数的访问级别;

  • 其次,如果 const 成员函数传出一个 reference,那么这个函数的调用者就可以通过这个 reference 修改那笔数据;

References、指针和迭代器统统都是 handles,而返回一个“代表对象内部数据”的 handle 会带来“较低对象封装性“的风险。

解决返回 handles 函数的影响

如果一定要让函数返回 handles,那么一定要用 const 关键字修饰:

class Rectangle {
public:
    ...
    const Point& upperLeft() const { return pData->ulhc; }
    const Point& lowerRight() const { return pData->lrhc; }
    ...
};

但即使这样,它们也很有可能导致 dangling handles(空悬的号码牌)。

dangling handles 指那些指向不复存在对象的 handles。

const Rectangle boundingBox();    // 以 by value 的形式返回一个矩形
const Point* pUpperLeft = &(boundingBox().upperLeft());

这种情况下 pUpperLeft 指向的对象存在于栈空间中,当函数调用结束后,对象空间被回收。

Last updated

Was this helpful?