[原創(chuàng)文章歡迎轉(zhuǎn)載,但請保留作者信息]
Justin 于 2009-12-15
這里的“把柄”原文為handle,實在不知道怎么翻譯,文中指的是:引用(reference)、指針(pointer)和迭代器(iterator)。
而所謂的對象內(nèi)部成員,則包括了數(shù)據(jù)成員以及保護/私有函數(shù)。
因此第28條軍規(guī)的要求就是:不要在函數(shù)中返回對象內(nèi)部的(私有)數(shù)據(jù)成員或者是保護/私有函數(shù)的引用、指針或是迭代器。【應該也不一定吧?】
如果只需要讀訪問,就使用const的返回值,不要開放寫的權限。
有可能產(chǎn)生懸垂指針(dangling pointer)也是暴露對象內(nèi)部成員“把柄”的后果之一。書中給出一個例子說明了這個問題:一個返回對象內(nèi)部成員的函數(shù),在用戶不正確使用的情況下,就有可能產(chǎn)生懸垂指針。
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..
可是,這個軍規(guī)似乎也太苛刻了些。總歸有需要返回對象“把柄”的時候。如果用戶自己犯糊涂,我攔也攔不住啊……