Effective C++ 条款28 避免返回handles指向对象内部成分
1. 所谓的handles指的是引用,指针,迭代器(可能与windows的句柄有所区别),返回一个handles会导致提供给用户对象内部数据的间接访问,这降低了成员变量的封装性,例如:
class Demo{ public: ... int* getPtr() const { return ptr; } private: ... int* ptr; }
这段代码语法正确,但是它违背了将getPtr设为const的初衷:从语法上来说ptr所指对象也属于Demo对象的一部分,但从语法上讲,由于编译器遵循bitwise const,因而const只限制到ptr,而ptr所指对象允许用户更改,因此如果函数返回handles可能会降低对象封装性,并使用户能够间接接触到被封装的内容.
2. 此外,返回handles可能会导致dangling handles(垂悬handles)的存在,因为指针,引用,迭代器提供的是对对象的间接访问,因此实体被销毁而指向它的handles可能仍然存在,此时如果仍然企图通过handles进行对对象(尤其是对于类型转换产生的临时对象而言)的间接访问就有可能导致错误,例如:
class Demo{ public: ... Demo(int*); int* getPtr() const { return ptr; } private: ... int* ptr; }
那么以下语句就是及其危险的:
int* tmp=new int; int* ptr=Demo(tmp).getPtr(); //ptr指向了一个被销毁的临时对象的成员!