天天看點

C++ Primer 第三版 讀書筆記

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 = { 0, 0 };

      //相當于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 <cstring>

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

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

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

    #include <assert.h>

      assert  通用預處理宏(斷言 P/12)

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

    #include <iomanip>

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

繼續閱讀