C++ Primer 第三版 讀書筆記

前言

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

 

聲明

  歡迎轉載,但請保留文章原始出處:)
 

    農民伯伯:http://over140.blog.51cto.com/

 

 

正文

 

  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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章