C Primer 第三版 讀書筆記

2021-09-03 09:56:22 字數 2776 閱讀 5070

前言

《c++ primer》第三版這本書還是去年做window mobile 6開發時看完的,看完後做了一些筆記到本子後就沒管了。今天偶爾翻出來趕緊寫一篇文章備份一下,據說每次重讀這本書都有新的收穫,正所謂溫故而知新,可見這本書之經典。

宣告

農民伯伯:

正文

1.  如果乙個變數是在全域性定義的,系統會保證給它提供初始化值0。如果變數是區域性定義的,或是通過new表示式動態分配的,則系統不會向它提供初始值0

2.  一般定義指標最好寫成:" string *p; " 而不是 " string* p; "

3.  試圖將乙個非const物件的指標指向乙個常量物件的動作將引起編譯錯誤

4.  引用型別主要作用於函式的形式引數  p/89

5.  列舉成員的值不必唯一

6.  乙個陣列不能被另外乙個陣列初始化,也不能被賦值給另乙個陣列。而且,c++不允許宣告乙個引用陣列(即由引用組成的陣列)  p/95

7.  volatile修飾符的主要目的是提示編譯器,該物件的值可能在編譯器未檢測到的情況下被改變,因此編譯器不能對引用這些物件的**作優化處理。

8.  逗號表示式的結果是最右邊表示式的值(從左向右)  p/135

9.  關於位操作符的詳細介紹和使用方法參見p/136,講得很透徹

10.  容器

10.1  關聯容器

10.1.1  map  p/247

"鍵/值"對:鍵用來索引map,而值用來儲存資料。

插入單個元素最好用insert(不使用下標方式)   p/248 - p/249

10.1.2  set  p/256

10.1.3  比較  p/247

如果只想知道乙個值是否存在時,用set最有用,希望儲存(也可能修改)乙個相關的值時,map最有用

10.2  順序容器

10.2.1  list

非連續記憶體區域,允許雙向遍歷,插入、刪除效率高,對隨機訪問支援不好,需要遍歷,且每個元素有兩個指標的額外空間開銷。

10.2.2  vector

表示一段連續的記憶體區域,每個元素被順序儲存在這段內中。隨機訪問效率很高,但是插入、刪除效率低(除非是最後乙個元素),右邊的元素都要重新拷貝一次。(deque也是一端連續記憶體,但是支援高效的在首部插入和刪除元素。它通過兩級陣列結構來實現。)

vector自增長方式:分配兩倍於當前容器的儲存區,把當前的值拷貝到新分配的記憶體中,並釋放原來的記憶體。

10.2.3  list與vector比較 (vector還是list? p/213)

11.  呼叫函式比直接計算條件操作符要慢得多——inline機制用來優化小的、只有幾行的、經常被呼叫的函式  p/303

12.  標頭檔案不應該含有非inline函式或物件的定義

13.  在函式中頻繁使用的自動變數可使用register宣告為暫存器自動物件。出現在迴圈語句中的陣列索引和指標是暫存器物件的很好例子:

for( register int ix = 0; ix < sz; ++ix )

如果所選擇的變數被頻繁使用,則暫存器變數可以提高函式的執行速度。

注意:關鍵字register對編譯器來說只是乙個建議,有些編譯器可能忽略該建議,而是使用暫存器分配演算法找出最合適的候選放到機器可用的暫存器中。  p/337

14.  如果運算元被設定為0,則c++會保證delete表示式不會呼叫操作符delete(),沒有必要測試是否為0。 p/340

if( pi != 0 )  //沒必要寫這行

delete pi;

15.  delete pi 之後,pi成為空懸指標,建議設定指標為0  p/340

16.  自動指標auto_ptr  見p/341

17.  c++支援從c語言繼承而來支援顯式初始化表的機制,類似於用在初始化陣列:

data local1 = ;

//相當於local1.ival = 0; local1.ptr = 0;

根據資料成員被宣告的順序,這些值按位置被解析。  p/566

18.  explict關鍵字用於關閉編譯器隱式轉換

19.  每個return語句之間,內聯析構函式都必須被展開(編譯時),所以建議函式內盡量少return,可用其它變數代替的就代替。

20.  int a = b + c ;  //是對a的初始化

int a;

a = b + c ;    //賦值操作,前面比後面高效

21.  "::"、".*"、"."、"?:"四個操作符不能被過載

22.  typeid用於獲取物件/變數的實際型別,用法:typeid(type).name()

23.  函式介紹

sizeof  作用是返回乙個物件或型別名的位元組長度。  p/132

isalpha  判斷是不是乙個英文本母

#include

int strlen( const char* )  //返回字串的長度

int strcmp( const char*, const char* )  //比較兩個字串是否相等

char* strcpy( char*, const char* )  //把第二個字串拷貝到第乙個字串中

#include

assert  通用預處理巨集(斷言 p/12)

#include //包括各種資料結構的元素檢索、替換、逆序等等通用的演算法。sort/find/max

#include

setw()          //功能與scanf類似,它讀入的字元數最多為傳遞給它的引數減1  p/112

C Primer 第三版 讀書筆記

前言 c primer 第三版這本書還是去年做window mobile 6開發時看完的,看完後做了一些筆記到本子後就沒管了。今天偶爾翻出來趕緊寫一篇文章備份一下,據說每次重讀這本書都有新的收穫,正所謂溫故而知新,可見這本書之經典。宣告 農民伯伯 正文 1.如果乙個變數是在全域性定義的,系統會保證給...

C Primer 第三版 讀書筆記

前言 c primer 第三版這本書還是去年做window mobile 6開發時看完的,看完後做了一些筆記到本子後就沒管了。今天偶爾翻出來趕緊寫一篇文章備份一下,據說每次重讀這本書都有新的收穫,正所謂溫故而知新,可見這本書之經典。宣告 農民伯伯 正文 1.如果乙個變數是在全域性定義的,系統會保證給...

C Primer 第三版 讀書筆記

1.如果乙個變數是在全域性定義的,系統會保證給它提供初始化值0。如果變數是區域性定義的,或是通過new表示式動態分配的,則系統不會向它提供初始值0 2.一般定義指標最好寫成 string p 而不是 string p 3.試圖將乙個非const物件的指標指向乙個常量物件的動作將引起編譯錯誤 4.引用...