[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-12-15
这里的“把柄”原文为handle,实在不知道怎么翻译,文中指的是:引用(reference)、指针(pointer)和迭代器(iterator)。
而所谓的对象内部成员,则包括了数据成员以及保护/私有函数。
因此第28条军规的要求就是:不要在函数中返回对象内部的(私有)数据成员或者是保护/私有函数的引用、指针或是迭代器。【应该也不一定吧?】
如果只需要读访问,就使用const的返回值,不要开放写的权限。
有可能产生悬垂指针(dangling pointer)也是暴露对象内部成员“把柄”的后果之一。书中给出一个例子说明了这个问题:一个返回对象内部成员的函数,在用户不正确使用的情况下,就有可能产生悬垂指针。
class AClass{//..};
class BClass{
//..
const AClass& FuncReturningARef();
//..
}
//a possible user's code
BClass AnObjectOfB;
const AClass *pAClass = &(AnObjectOfB.FunReturningARef());
//After the call pAClass becomes a dangeling pointer..
可是,这个军规似乎也太苛刻了些。总归有需要返回对象“把柄”的时候。如果用户自己犯糊涂,我拦也拦不住啊……