1. 程式人生 > >《C++Primer 5》筆記(2)

《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 編寫自己的標頭檔案