c++ primer 5th 笔记:第二章
第二章:變量和基本類型
筆記:
1. c++語言規定一個int至少和一個short一樣大,一個long至少和一個int一樣大,一個long long至少和一個long一樣大。其中,數據類型long long是在c++11中新定義的。
2. 執行浮點運算選用double,這是因為float通常精度不夠而且雙精度浮點和單精度浮點數的計算代價相差無幾。
3. 切勿混用帶符號類型和無符號類型。其中,帶符號數會自動地轉換成無符號數。
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)。
6. c++語言中,初始化和賦值時兩個完全不同的操作。
7. c++11新標準中,用花括號來初始化變量得到了全面應用,被稱為列表初始化(list initialization)。這種初始化有一個重要特點:如果我們使用列表初始化且初始值存在丟失信息的風險,則編譯器將報錯。如:
long double ld = 3.1415926536;int a{ld}, b = {ld}; //錯誤:轉換未執行,因為存在丟失信息的危險int c(ld), d = ld; //正確:轉換執行,且確實丟失了部分信息8. 定義在函數體內部的內置類型將不被初始化(uninitialized)。
9. 建議初始化每一個內置類型的變量。
10. c++支持分離式編譯,即允許將程序分割為若干個文件,每個文件可被獨立編譯。
11. 聲明使得名字唄程序所知,而定義會申請存儲空間,還可能為變量賦一個初始值。只聲明用關鍵字extern。
extern int i; // 聲明i而非定義iint j; // 聲明并且定義jextern 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的常量指針,頂層constconst 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;};#endif23. 通常將頭文件中類的名字來構建保護符的名字,以確保唯一性,且名字全部大寫。
重點知識點總結:
待補充知識點:decltype類型指示符。
c++中const限定符:
1. 允許一個常量的引用半丁非常量的對象、字面值,甚至是一個一般表達式。
2. 允許另一個指向常量的指針指向一個非常量。
3. 頂層const表示指針本身是一個常量,而名詞底層const表示指針所指的對象時一個常量。
4. 底層cosnt的限制不能忽視,拷貝時,對象必須具有相同的底層const資格或者兩個對象的數據類型必須能夠轉換,一般來說,非常量可以轉換為常量,反之不行。
如:
/* 范圍1cosnt int ci = 1024;const int &r1 = ci; //正確:引用機器對象都是常量r1 = 41; //錯誤:r1是對常量的引用int &r2 = ci; // 錯誤:試圖讓一個非常量引用指向一個常量對象*//*范圍2int 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是一個普通的非常量引用*//*范圍3int i = 0;int *const p1 = &i; // 不能改變p1的值,這是一個頂層constconst int ci = 42; // 不能改變ci的值,這是一個頂層constconst int *p2 = &ci; // 允許改變p2的值,這是一個底層constconst int *const p3 = p2; //靠右的const是頂層const,靠左的是底層constconst 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
轉載于:https://www.cnblogs.com/wzhe/p/5997817.html
總結
以上是生活随笔為你收集整理的c++ primer 5th 笔记:第二章的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: db_recovery_file_des
- 下一篇: 51CTO -- 网络自学的瓶颈期