1. 程式人生 > >《Effective C++》讀書筆記二

《Effective C++》讀書筆記二

19、避免返回handles(指標,引用,迭代器)指向物件內部成分

即使函式前面加上const,變成

const Point& upperLeft() const{}

意味著呼叫者拿到Point引用但是不能塗寫,但是讓呼叫者拿到了引用,通過拿到的引用物件呼叫裡面的成員,如果執行這句話時該引用已經不存在(銷燬),那麼會變成一個空懸、虛吊的物件

20、瞭解inlining的裡裡外外

21、前置宣告和include的區別

一般原則:

  • 標頭檔案中儘量少使用 include,如果可以前置宣告解決,那是最好的。
  • 實現標頭檔案中也要儘量少 include ,不要 include 沒有用到的標頭檔案。

這樣做的好處:

     減少編譯速度

什麼情況用前置宣告:

  • 如果類作為指標或引用方式的呼叫

什麼情況必須include:

  • 如果類作為物件呼叫,或作為靜態成員呼叫

總結一下,對於C++類而言,如果它的標頭檔案變了,那麼所有這個類的物件所在的檔案都要重新編譯,但如果它的實現檔案(cpp檔案)變了,而標頭檔案沒有變(對外的介面不變),那麼所有這個類的物件所在的檔案都不會因之而重編。因此,避免大量依賴性編譯的解決方案就是:在標頭檔案中用class宣告外來類(前置宣告),用指標或引用代替變數的宣告;在cpp檔案中包含外來類的標頭檔案。

另外,書上也提倡把class x; class xx; class xxx;的宣告放至一個名為”xxxfwd.h”的標頭檔案裡,比如”datefwd.h”,這個標頭檔案裡面只有宣告式,而沒有具體的類細節。也就是說,對於某個類,比如MyDate,應該分出三個檔案,一個是datefwd.h,裡面是一些用到的外來的class宣告式;一個是MyDate.h裡面是MyDate類的結構宣告;一個是MyDate.cpp,它與MyDate.h配對,給出具體的實現細節。

書上說的Handler classes更想讓我們在類A的基礎上另造一箇中間類AImp(成員函式完全與類A一致),這個中間類的成員中裡面放置了所有類A需要的外來類的物件,然後類的邏輯細節完全在Almp.cpp中實現,而在A.cpp裡面只是去呼叫Almp.cpp的同名方法。A.h的成員變數只有Almp的指標,這看上去好像一個Handler,因此而得名。