C++有幾種複合類型,包括常見的兩種:引用和指針。spa
1.引用指針
使用術語「引用」時,指的實際上是「左值引用」。對象
引用類型引用另一種類型。作用域
int ival = 1024;變量
int &refVal = ival; refVal 指向ival引用
int &refVal2; 報錯:引用必須被初始化 程序
~~~~~~~~~~~~~引用~~~~~~~~~~~~~~~~co
1. 通常初始化變量時,初始值會被拷貝到新建的對象中。術語
2. 定義引用時,程序把引用和它的初始值綁定在一塊兒,並不是將初始值拷貝到引用。 block
3. 初始化完成,引用將和它的初始對象一直綁定在一塊兒,進而沒法令引用從新綁定到另一個對象,所以引用必須初始化。
4. 引用並不是對象,僅僅是爲了一個已經存在的對象起的另一個名字。
5. 定義引用後,對其進行的全部操做都是在與之綁定的對象上進行的。
6. 引用自己不是一個對象,因此不能定義引用的引用。
7. 引用只能綁定到對象上,不能與字面值或某個表達式的計算結果綁定在一塊兒。
~~~~~~~~~~~~~指針~~~~~~~~~~~~~~~~
1.指針是「指向」另一種類型的複合類型。
2.指針存放某個對象的地址,獲取該地址,要使用取地址符。
int ival = 42;
int *p = &ival;
3.通常狀況下,指針的類型要和他指向的對象嚴格的匹配。
4.對指針解引用會獲得所指的對象,所以對解引用的結果賦值,實際上也就是給指針所指的對象賦值。
int ival = 42;
int *p = &ival;
cout << *p; 42
*p = 0;
cout << *p; 0
5.空指針
空指針不指向任何對象,獲得空指針最直接的辦法就是用字面值nullptr來初始化指針。
6.指針和引用都能提供對其餘對象的間接訪問,在具體實現細節上有着巨大的不一樣。其中,引用自己並不是一個對象,一旦定義了引用,就沒法令其綁定到另一個對象上,以後每次使用這個引用都是訪問他最初綁定的那個對象上。
指針和它存放的地址就沒有這種限制,和其餘任何變量同樣,指針賦值就是令它存放一個新的地址,從而指向一個新的對象。
2.指針與引用有不少的不一樣點:
1.指針自己就是一個對象,容許對指針進行賦值和拷貝,並且在指針的聲明週期內能夠前後指向幾個不一樣的對象。
1.引用自己並非一個對象,定義引用時,將它和初始值一直綁定在一塊兒,初始化完成後,沒法令引用從新綁定到另一個對象上。
2.指針無需在定義時賦值,和其餘內置類型同樣,在塊做用域內定義的指針若是沒有被初始化,也將擁有一個不肯定的值。
2.引用只能綁定到對象上,它只是一個對象的別名,所以引用必須初始化。