std::string str;
str = password;..
..//將password作為encrypted的初值,跳過毫無意義的default構造過程
std::string str
(password);.
..
上述行為可以避免構造非必要物件,還可以避免無意義的default構造行為。
c風格的轉型
(t)expression
t(expression)
c++提供的四種新式轉型
const_cast
(expression)
//通常用來將物件的常量性轉除,唯一有此能力的c++風格轉型操作符
dynamic_cast
(expression)
//安全向下轉型,用來決定某物件是否歸屬繼承體系的某個型別,可能耗費重大執行成本。
reinterpret_cast
(expression)
//執行低階轉型,實際動作可能取決於編譯器,表示它不可以移植
static_cast
(expression)
//強迫隱式轉換,它不能將const轉換成non const,只有const_cast能做到
使用c++新式轉型的好處:容易在**中辨識出來;各轉型動作越窄化,編譯器越可能診斷出錯誤的運用
使用舊式轉型的時機:呼叫乙個explicit建構函式將乙個物件引數傳遞給乙個指標時。
1.類的const成員函式不允許在該函式內部修改該類的成員變數,但是當該函式返回指向物件成員變數的handles,這就會使外部能通過這個handle修改物件的成員變數,這個是矛盾的。解決方法是:返回值加上const (const ***& yyy()const )。
2.如果返回物件的成員變數被析構,這樣的話,物件裡的成員變數就會指向乙個不存在的物件,舊變成虛吊。這是非常危險的。
3.不意外著絕對不可以讓成員函式返回handle,有時候你必須這麼做。例如:strings vector
優點:沒有函式呼叫的額外開銷
缺點:程式體積太大,會導致額外的換頁行為,降低指令高速緩衝器裝置的擊中率,以及伴隨而來的效率損失。
1.inline只是對編譯器的乙個申請,不是強制命令。這項申請可以隱式提出(將函式定義於類定義式內),也可以明確提出(加上關鍵字inline)。
2.inline函式通常一定被置於標頭檔案內,因為大多數建置環境在編譯過程中進行inline,為了將函式呼叫替換成函式本體,編譯器必須知道那個函式長什麼樣子。template通常也被置於標頭檔案內,編譯器為了將它具現化,需要知道它長什麼樣子。
3.乙個表面上是inline的函式是否是真的inline,取決於你的建置環境,主要取決於你的編譯器。
平均而言乙個程式的80%執行時間花費在20%的**上。-找出那20%的**,然後將它inline或竭盡所能將它**。
原因:因為標頭檔案中內容的修改,會導致所有該標頭檔案的檔案必須重新編譯。
解決方法:宣告依存性替換定義的依存性。這正是編譯依存性最小化的本質。
eg:將物件實現隱藏於乙個指標背後,這般設計常被稱為pimpl idiom(pointer to implementation)
class
person
;
1.如果使用物件引用或物件指標可以完成任務,就不要會使用物件。
2.如果能夠,盡量以類宣告式代替類定義式。
3.為宣告式和定義式提供不同的標頭檔案。
宣告式標頭檔案 ***fwd.h命名方法取c++標準庫標頭檔案,比如iosfwd
c++也提供關鍵字export,允許將template宣告式和template定義式分割於不同的檔案中。由於支援這個關鍵字的編譯器比較少,因此現實中使用這個關鍵字的經驗也非常少。
像上面的person被稱為handle classes,這樣的類如何做事:將函式轉交給相應的實現類、讓person變成抽象基類
抽象基類:詳細一一描述派生類的介面,通常不帶成員變數,也沒有建構函式。只有乙個virtual析構函式以及一組純虛函式。
《Effective C 》 條款44 條款45
templates可以節省時間和避免 重複。對於類似的classes或functions,可以寫乙個class template或function template,讓編譯器來做剩餘的事。這樣做,有時候會導致 膨脹 code bloat 其二進位製碼帶著重複 或幾乎重複 的 資料,或者兩者。但這時候...
C 資源管理(13 17條款)
舉個例子 class teamsys teamsys createteamsys 返回指向動態分配的物件teamsys的指標,呼叫者有責任刪除它。voidf 以上 中 可能會出現異常或者return 會導致ts所指向的物件資源無法被釋放。1.使用auto ptr可以避免f函式潛在的資源洩露可能性 v...
C 構造 析構 賦值運算(05 12條款)
編譯器可以暗自為class建立預設建構函式 拷貝建構函式 初始化呼叫 拷貝賦值操作符 賦值呼叫 析構函式 類名 類名 類名 operator const 類名 rhs 為了阻止編譯器自動生產函式 自行宣告函式 為了防止別人呼叫 宣告為private 為了防止友元函式和成員函式呼叫 只定義不實現 為駁...