1. handles:引用、指针、迭代器。
若返回的handles前没加const,成员变量的封装性最多只等于“返回其handles”的函数的访问级别。若const成员函数传出一个非const引用,那么这个函数的调用者可以修改成员变量,这与const成员函数的意义相矛盾。
就算返回的是const handles,但可能导致dangling handles。例如:
class GUIObject { ... };
const Rectange boundingBox(const GUIObject & obj); // 此处返回const 是避免“无意义的赋值动作”,见条款3
GUIObject * pgo;
...
const point * pUpperLeft = &(boundingBox(*pgo).upperLeft());
这里upperLeft为返回const handles的成员函数。对boundingBox的调用获得一个新的、暂时的Rectange对象,在这个语句结束之后,boundingBox的返回值将被销毁。
所以,记住:不要让指针指向临时对象。
2.
// A.h
class A {}
A get_A() { retur A(); } // error!非类的成员变量要在.cpp中定义。
总结:
避免返回handles指向对象内部。遵守这个条款可以增加封装性,帮助const成员函数的行为像个const,并将发生dangling handles的可能性降至最低。