企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
## 条款28:避免返回 handles 指向对象内部成分 Avoid returning "handles" to object internals. ### 返回 handles 的问题 让成员函数返回 handles 指向对象内部成分是比较糟糕的做法: ```cpp 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 关键字修饰: ```cpp class Rectangle { public: ... const Point& upperLeft() const { return pData->ulhc; } const Point& lowerRight() const { return pData->lrhc; } ... }; ``` 但即使这样,它们也很有可能导致 dangling handles(空悬的号码牌)。 > dangling handles 指那些指向不复存在对象的 handles。 > > ```cpp > const Rectangle boundingBox(); // 以 by value 的形式返回一个矩形 > const Point* pUpperLeft = &(boundingBox().upperLeft()); > ``` > > 这种情况下 `pUpperLeft` 指向的对象存在于栈空间中,当函数调用结束后,对象空间被回收。