《C++Primer 5》筆記(2)
第二章 變數和基本型別
2.1.基本內建型別(算數型別和空型別)
2.1.1 算數型別(整型(包括字元與布林型別在內))
計算各種大小(class、struct、union)
2.1.2 型別轉換
2.1.3 字面值常量
稱之為字面值是因為只能用它的值稱呼它,稱之為常量是因為它的值不能修改。並且每個字面值都有相應的型別。
整型和浮點型字面值
預設的浮點字面值常量為 double 型別。
字元和字串字面值
轉義序列
指定字面值的型別
布林字面值(true/false)和指標字面值(nullptr)
2.2 變數
物件:一塊能儲存資料並具有某種型別的記憶體空間。
2.2.1 變數定義
宣告&定義
為了允許把程式拆分成多個邏輯部分。C++支援分離式編譯。為了支援分離式編譯,C++語言把宣告與定義區分開。宣告規定了變數的型別和名字,但定義申請了儲存空間,也可能會為其附一個初始值。
在函式體內部,不能初始化一個由extern關鍵字標記的變數。
初始化&賦值
定義的方式
int test=0;
int test(0);
int test={0};
int test{0};
作為C++11新標準的一部分,使用花括號來初始化變數得到了全面應用。這種形式稱為列表初始化。對於內建型別的變數,如果使用列表初始化且初始值存在丟失資訊的風險,則編譯器將報錯。
預設初始化
如果定義變數時未指定初始值,則變數被預設初始化,預設值由變數型別與位置有關。內建型別定義在任何函式體之外的變數預設初始化為0;定義於函式體之內的內建變數不被初始化。每個類各自決定其初始化物件的方式。
2.2.3 識別符號(字母、數字和下劃線組成,必須以字母或下劃線開頭)
2.2.4 名字的作用域
2.3 複合型別(基本資料型別 宣告符列表)
2.3.1 引用(左值引用/C++11右值引用)
引用為物件起了另一個名字,不同於普通的初始化,定義引用初始化時,引用與初值繫結在一起,而不是將值複製給引用,一旦初始化完成,引用無法再繫結另一個物件,因此引用必須初始化。
2.3.2 指標
不同於引用,指標本身是一個物件,允許賦值和拷貝,在生命週期可以指向不同的物件,無需在定義時初始化。
野指標/空指標
空指標
void* 指標(無法獲取記憶體空間中的物件)
2.3.3 理解複合型別的宣告
指向指標的引用(int*&r=p)
2.4 const限定符
預設狀態下,const物件僅在檔案內有效。
2.4.1 const的引用
初始化和對const的引用:引用的型別必須與其所引用物件的型別一致,但有兩個例外:
(1)初始化常引用時允許用任意表達式作為初值,只要該表示式可以轉換成對應的型別。
double pi = 3.14;
const int &p = pi;
本質:
double pi = 3.14;
const int temp=pi;
const int &p = temp;
(2)對const的引用可能是一個非const的物件
const int a=0;
const int &b=a;
int &c=a;//錯誤;可以通過c修改a,const a無意義
int d=0;
const int &e=d;
2.4.2 指標和const(類比const與引用)
2.4.3 頂層const
2.4.4 constexpr和常量表達式
constexpr定義一個指標,限定符只對指標有效,對所指物件無效。
constexpr int*p=nullptr;//p是指向整數的常量指標
2.5 處理型別
2.5.1 類型別名(typedef)
2.5.2 auto型別說明符
2.5.3 decltype型別指示符
2.6.3 編寫自己的標頭檔案