c++ primer 5th 筆記:第二章

第二章:變量和基本類型c++

  筆記:express

    1. c++語言規定一個int至少和一個short同樣大,一個long至少和一個int同樣大,一個long long至少和一個long同樣大。其中,數據類型long long是在c++11中新定義的。安全

    2. 執行浮點運算選用double,這是由於float一般精度不夠並且雙精度浮點和單精度浮點數的計算代價相差無幾。函數

    3. 切勿混用帶符號類型和無符號類型。其中,帶符號數會自動地轉換成無符號數。spa

    4. 轉義序列以反斜線做爲開始,如\n、\t、\"、\'。也可使用泛化的轉義序列,如\7(響鈴)、\12(換行符)、\x4d(字符M)。形式是\x後緊跟1個或多個十六進制數字,或者\後緊跟1個、2個或3個八進制數字。參考ASCII碼。指針

    5. 指定字面值的類型,如L'a'(類型是wchar_t)、u8"hi!"(utf-8字符串字面值)、1E-3F(單精度浮點型字面值,類型是float)。c++11

    6. c++語言中,初始化和賦值時兩個徹底不一樣的操做code

    7. c++11新標準中,用花括號來初始化變量獲得了全面應用,被稱爲列表初始化(list initialization)。這種初始化有一個重要特色:若是咱們使用列表初始化且初始值存在丟失信息的風險,則編譯器將報錯。如:對象

    long double ld = 3.1415926536;
    int a{ld}, b = {ld};   //錯誤:轉換未執行,由於存在丟失信息的危險
    int c(ld), d = ld;        //正確:轉換執行,且確實丟失了部分信息

    8. 定義在函數體內部的內置類型將不被初始化(uninitialized)。blog

    9. 建議初始化每個內置類型的變量。

    10. c++支持分離式編譯,即容許將程序分割爲若干個文件,每一個文件可被獨立編譯

    11. 聲明使得名字唄程序所知,而定義會申請存儲空間,還可能爲變量賦一個初始值。只聲明用關鍵字extern。

    extern int i;   // 聲明i而非定義i
    int j;             // 聲明而且定義j
    extern double pi = 3.1415;  //定義

    12. 變量能且只能被定義一次,可是能夠被屢次聲明。

    13. (a)做用域分爲全局做用域塊做用域,定義於main函數以外變量具備全局做用域。(b)做用域能彼此嵌套,被包含的做用域稱爲內層做用域(inner scope),包含着別的做用域的做用域稱爲外層做用域。(c)做用域中一旦聲明瞭某個名字,它所嵌套着的全部做用域中都能訪問到該名字。(d)同時,容許內層做用域中從新定義外層做用域中已有的名字,來覆蓋外層名字。而在內層做用域中能夠用::reused來訪問外層名字。

    14. 定義引用時,程序把引用和它的初始值綁定(bind)在一塊兒,而不是將初始值拷貝給引用,並且引用只能綁定在對象上,引用即別名

    15. 空指針(null pointer)用NULL、0、nullptr來表示,字面值nullptr是新標準剛引入的一種方法。最好使用nullptr。

    16. 引用自己並不是是一個對象,而指針是一個存儲地址的對象

    17. 類型別名(type alias)是一個名字,它是某種類型的同義詞。用關鍵詞typedef。新標準規定一種新方法,使用別名聲明(alias declaration)來定義類型別名。關鍵字using。如:

      typedef double wages;
      typedef wages base, *p;   // p是double*的同義詞
      using SI = Sales_item;     // SI是Sales_item的同義詞

      類型別名重難點理解:

      typedef char *pstring;
      const pstring cstr = 0;   // cstr是指向char的常量指針,頂層const
      const pstring *ps;         // ps是一個指針,它指向的對象是指向char的常量指針

    18. c++11新標準引入了auto類型說明符,用它就能讓編譯器替咱們去分析表達式所屬的類型。由於編譯器經過初始值推斷出變量的類型,因此auto定義的變量必須有初始值

    19. c++11新標準引入另外一種類型說明符decltype,它的做用是選擇並返回操做數的數據類型,編譯器分析表達式並獲得它的類型,卻不實際計算表達式的值。如:

      decltype(f()) sum = x;

    20. c++11新標準規定,能夠爲類中數據成員提供一個類內初始值(in-class initializer)。如:

    struct Sales_data
    {
        std::string bookNo;
        unsigned units_sold = 0;
        double revenue = 0.0;
    };

    21. 類一般被定義在頭文件中,並且類所在頭文件的名字應與類名字同樣。

    22. 確保頭文件屢次包含仍能安全工做的經常使用技術是預處理器(preprocessor),如:

    #ifndef  SALES_DATA_H
    #define SALES_DATA_H
    #include <string>
    struct Sales_data
    {
        std::string bookNo;
        unsigned units_sold = 0;
        double revenue = 0.0;
    };
    #endif            

    23. 一般將頭文件中類的名字來構建保護符的名字,以確保惟一性,且名字所有大寫

  重點知識點總結:

  待補充知識點:decltype類型指示符。  

  c++中const限定符

    1. 容許一個常量的引用半丁很是量的對象、字面值,甚至是一個通常表達式。

    2. 容許另外一個指向常量的指針指向一個很是量。

    3. 頂層const表示指針自己是一個常量,而名詞底層const表示指針所指的對象時一個常量。

    4. 底層cosnt的限制不能忽視,拷貝時,對象必須具備相同的底層const資格或者兩個對象的數據類型必須可以轉換,通常來講,很是量能夠轉換爲常量,反之不行。

    如:

    /* 範圍1
    cosnt int ci = 1024;
    const int &r1 = ci;    //正確:引用機器對象都是常量
    r1 = 41;      //錯誤:r1是對常量的引用
    int &r2 = ci;    // 錯誤:試圖讓一個很是量引用指向一個常量對象
    */

    /*範圍2
    int i = 42;
    const int &r1 = i;    //正確(經常使用):容許將const int& 綁定到一個普通int對象上
    const int &r2 = 42;    // 正確:r2是一個常量引用;編譯器會將其綁定到一個臨時對象上
    const int &r3 = r1 * 2;    //正確:r3是一個常量引用
    int &r4 = r1 * 2;    // 錯誤:r4是一個普通的很是量引用
    */

    /*範圍3
    int i = 0;
    int *const p1 = &i;   // 不能改變p1的值,這是一個頂層const
    const int ci = 42;     //  不能改變ci的值,這是一個頂層const
    const int *p2 = &ci;  // 容許改變p2的值,這是一個底層const
    const int *const p3 = p2;  //靠右的const是頂層const,靠左的是底層const
    const int &r = ci;     // 用於聲明引用的const都是底層const

  術語

    轉義序列(escape sequence)、類型說明符(type specifier)、做用域(scope)、複合類型(compound type)、

    引用(reference)、預處理變量(preprocessor variable)、常量表達式(const expression)、類型別名(type alias)、

    預處理器(preprocessor)、頭文件保護符(header guard)。

    術語解釋:

    常量表達式(const expression):指值不會改變而且在編譯過程就能獲得計算結果的表示式。

                                                 2016-10-25 19:32:34

相關文章
相關標籤/搜索