Effective C 讀書筆記 28

2021-06-16 19:22:47 字數 1530 閱讀 5879

條款28:避免返回handle指向物件內部成分

首先handle是指reference、指標和迭代器等都可以稱之為handle,因為她們都是用來取得乙個物件的,返回乙個handle指

向物件的內部成分主要會造成下面的兩種情況:

1.增大了成員的訪問許可權,如下例子:

class point;

struct rectdata;

class rectangle

point& lowerright() const

...private:

std::str::shared_ptrpdata;

};

上面定義了三個類,我們在看下面的應用:

point coord1(0,0);

point coord2(1,1);

const rectangle rect(coord1,coord2);

rect.upperlefter().setx(10);

在上面的例子中,rect的成員函式是乙個const的成員函式,正常情況下是不能修改物件的任何成員的,但是在這裡他卻

修改了物件的成員變數!之所以如此是因為函式upperlefter返回了乙個reference的物件,這樣通過該reference就可以獲得物件內部

的成員變數,從而可以對成員進行修改!因此需要注意:成員變數的封裝最多只能等於"返回其reference"的函式的訪問級別,在

例子中;lrhc是private的許可權,當時函式upperlefter卻返回了該成員的reference並且他是public的,因此該成員函式的許可權是public

的。第二,如果const成員函式傳出乙個reference,後者所指向的資料與該物件相關聯,而且該reference的物件是在物件之外,那麼

這個函式的呼叫者就可以修改那筆資料!例子防止setx被呼叫的乙個辦法就是返回乙個const reference!

2.

point coord1(0,0);

point coord2(1,1);

const rectangle rect(coord1,coord2);

rect.upperlefter().setx(10);

class guiobject

const rectangle boundingbox(const guiobject& obj);

guiobject* pgo;

const point* pupperleft = &(boundingbox(*pgo).upperlefr());

在上面的例子中,pupperleft指向了右邊表示式產生的臨時物件的內部成員point,但是在該條語句執行結束後,後邊的

的語句產生的臨時物件會自動的銷毀,此時pupperleft就會指向乙個無意義的空間!

請記住:

Effective C 讀書筆記 2

讓自己習慣c 條款1 視c 為乙個語言聯邦 c 可以看作是四種次語言組成的 c 包括區塊 語句 預處理器 內建資料型別 陣列 指標等 object oriented c 主要表現c 的面對物件的性質,包括類 封裝 繼承 多型性 virtual函式等 template c 為c 泛型程式設計部分 st...

《effective C 》讀書筆記

1,c 關鍵字explicit c 中,乙個引數的 建構函式 或者除了第乙個引數外其餘引數都有預設值的多參建構函式 承擔了兩個角色。1 是個 構造器,2 是個預設且隱含的型別轉換操作符 所以,有時候在我們寫下如 aaa 這樣的 且恰好 的型別正好是aaa單引數構造器的引數型別,這時候 編譯器就自動呼...

Effective C 讀書筆記

一 讓自己習慣c 1 條款01 視c 為聯邦語言 c 的組成可分為四部分 1.c c 仍然以c語言為基礎。區塊 語句 預處理 內建資料型別 陣列 指標等都來自c。2.object oriented c c with classes所訴說的 classes 包括構造和析構 封裝 繼承 多型 virtu...