高質量c 程式設計讀書筆記

2021-09-18 03:34:18 字數 3027 閱讀 4263

高質量c++程式設計讀書筆記

4+3+2+2+2+2+5+5+2+5+2 strcpy函式的原型: assert((src != null) && (dst != null)); char *address = dst; while ((*dst++ = *src++) !=

『\0』)

null; return address;

疑問1: // 相加函式,如果沒有 friend 修飾則只許有乙個右側引數 friend string operate+( const string &s1, const string &s2); 疑問2: 6-2-2 要點1: 6-3-2

6.6 引用與指標的比較 要點2:引用和指標 (1)引用被建立的同時必須被初始化(指標則可以在任何時候被初始化)。 (2)不能有 null 引用,引用必須與合法的儲存單元關聯(指標則可以是 null)。

(3)一旦引用被初始化,就不能改變引用的關係(指標則可以隨時改變指的物件)。 要點3: 不論兩個 print

函式的引數是否不同,如果類的某個成員函式要呼叫全 局函式 print,為了與成員函式 print 區別,全域性函式被呼叫時應加『::』標誌。

如 ::print(…); // 表示 print 是全域性函式而非成員函式 要點4:

8.2.成員函式的過載/覆蓋/隱藏 成員函式被過載的特徵: (1)相同的範圍(在同乙個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。

覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同; (3)引數相同; (4)基類函式必須有 virtual 關鍵字。

令人迷惑的隱藏規則

1.如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual關鍵字, 基類的函式將被隱藏(注意別與過載混淆)。

2.如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關鍵字, 此時,基類的函式被隱藏(注意別與覆蓋混淆)。

要點5: 第8章 c++函式的高階特性 對比於c語言的函式,c++增加了:

1.過載

2.內聯

3.const

4.virtual 四種新機制。 過載和內聯機制既可用於全域性函式也可用於類的成員函式 const與virtual機制僅用於類的成員函式

c++語言採用過載機制的理由

1.在c++程式中,可以將語義,功能相似的幾個函式用同乙個名字表示, 即函式過載,這樣便於記憶,提高了函式的易用性.

2.類的建構函式需要過載機制,因為c++規定建構函式與類同名。

要點6: 並不是兩個函式的名字相同就能構成過載 全域性函式和類的成員函式同名不算過載,因為函式的作用域不同

要點7:

8.1.3.當心隱式型別轉換導致過載函式產生二義性

疑問3: 如果派生類繼承了多個基類(包含了函式名字相同的函式) 那派生類怎麼區分呼叫的是哪乙個基類

8.3 引數的預設值 [root@192 learn_cpp]# vim output.cpp [root@192 learn_cpp]# pwd /home/zhusy/learn_cpp

要點88.5.1 用內聯取代巨集**

8.5.2 內聯函式的程式設計風格

1.inline是一種「用於實現的關鍵字」,而不是一種「用於宣告的關鍵字」。

2.定義在類宣告之中的成員函式將自動地成為內聯函式,例如: class a //自動地成為內聯函式 }

3.如果函式體內的**比較長,使用內兩將導致記憶體消耗代價較高

4.如果函式體內出現迴圈,那麼執行函式體內**的時間要比函式呼叫的開銷大

要點9 第九章 類的建構函式、析構函式與賦值函式 每個類只用乙個析構函式和乙個賦值函式,但可以有多個建構函式(包含乙個拷貝建構函式, 其他的稱為普通建構函式)。

疑問4:

9.2 建構函式的初始化表 ???如果類存在繼承關係,派生類必須在其初始化表裡呼叫基類的建構函式. 疑問5: ??? 9.5 不要輕視拷貝建構函式與賦值函式 big-three

要點10

10.1 繼承 若在邏輯上b是a的「一種」,並且a的所有功能和屬性對b而言都有意義,則允許 b繼承a的功能和屬性。

10.2 組合 若在邏輯上a是b的「一部分」(a part of),則不允許b從a派生,而是要用a和其它東西 組合出b

要點11

11.1.1 用const修飾函式的引數

1.const只能修飾輸入引數

2.如果輸入引數採用」指標傳遞「,那麼加const修飾可以防止意外地改動該指標,起到保護作用

3.如果輸入引數採用」值傳遞「,由於函式將自動產生臨時變數用於複製引數,該輸入引數本來就 無需保護,所以不要加const修飾

4.對於非內部資料型別的引數而言,像void func(a a)這樣宣告的函式注定效率比較低。因為函式 體內將產生a型別的臨時物件用於複製引數a,而臨時物件的構造、複製、析構過程都將消耗時間。

總結:1.對於非內部資料型別的輸入引數,應該將」值傳遞「的方式改為」const 引用傳遞「,目的是提高 效率。例如將void func(a a) 改為void func(const a &a).

2.對於內部資料型別的輸入引數,不要將」值傳遞「的方式改為」const引用傳遞「。否則既達不到提高 效率的目的,又降低了函式的可理解性。例如void func(int x)不應該改為void func(const int &x).

要點12

11.1.2 用const修飾函式的返回值

1.如果給以」指標傳遞「方式的函式返回值加const修飾,那麼函式的返回值(即指標)的內容不能被修改, 該返回值只能被賦給加const修飾的同型別的指標 例如函式 const char *getstring(void);

如下語句將出現編譯錯誤: char *str =getstring(); 正確的用法是 const char *str =

getstring();

2.如果函式返回值採用」值傳遞方式「,由於函式會把返回值複製到外部臨時的儲存單元中,加const修飾沒有 任何價值。

3.函式返回值採用」引用傳遞「的場合並不多,這種方式一般只出現在類的賦值函式中,目的是為了實現鏈式表達。

高質量C 程式設計指南讀書筆記

1.每個c 檔案通常分為兩個檔案。乙個檔案用於儲存程式的宣告,稱為標頭檔案。另乙個檔案用於儲存程式的實現,稱為定義檔案。1 版權資訊。2 檔名稱,識別符號,摘要。4 版本歷史資訊。檔名稱 filename.h 檔案標識 見配置管理計畫書 當前版本 1.1 作 者 sarah 琦琦 完成日期 2001...

高質量c c 讀書筆記

知錯就改 溫故知新 工作不忘學習 bool flag與 零值 的比較 if flag if flag int 型變數n與 零值 比較 if n 0 if n1 0 float 型變數x與 零值 比較 const float epsinon 0.000001 if x epsinon x epsino...

讀書筆記 高質量C C程式設計指南 目錄

序 最近痛下決心要好好學習下c和c 以為即將來臨的求職做點準備,在網上搜野指標的問題時看到了 高質量c c程式設計指南 對於我這種想從事嵌入式開發的人來說,猶如收穫到一本程式設計的bible似的。此文對c和c 程式設計的風格及注意事項進行了精妙的分析,集合了thinking in c effecti...