[原創文章歡迎轉載,但請保留作者信息]
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..
可是,這個軍規似乎也太苛刻了些。總歸有需要返回對象“把柄”的時候。如果用戶自己犯糊涂,我攔也攔不住啊……