第二章:變量和基本類型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