C++ 左值參照與一級指標

2022-09-21 06:00:26

左值參照用於一級指標時,有以下幾種用法:

//方式一:參照一級指標,常規用法
int a = 5;
int * pa = &a;
int * &rpa = pa;

//方式二:參照指向常數的一級指標,以下幾種為等效表示
int a = 5;
const int * pa = &a;
const int * &rpac = pa; //方式一
int const * &rpac = pa; //方式二

//方式三:參照一級指標的常參照,參照自身為常數
int a = 5;
int * pa = &a;
int * const &crpa = pa;

//方式四:參照指向常數的一級指標,且參照自身為常數,以下幾種為等效表示
int a = 5;
int * pa = &a;
const int * const &crpac = pa; //方式一
int const * const &crpac = pa; //方式二

Microsoft Visual Studio 中連續多個 const 會被編譯器解釋成一個,即 const const const const int *&const int *& 等效,除此之外,const int const *&Microsoft Visual Studio 中也與 const int *& 等效,而 int *& constQT minGW 中將會報錯,在 Microsoft Visual Studio 中與 int *& 等效。

各型別參照可修改屬性如下表所示:

參照型別 修改 *rp 修改 rp
int * &rp 可以 可以
const int * &rp 不可以 可以
int * const &rp 可以 不可以
const int * const &rp 不可以 不可以

若將變數的地址賦予參照(例如 rp=&x),各型別參照可接受的變數地址如下表所示:

參照型別 int變數地址 const int變數地址
int * &rp 不可以 不可以
const int * &rp 不可以 不可以
int * const &rp 宣告時可以(將建立臨時變數) 不可以
const int * const &rp 宣告時可以(將建立臨時變數) 宣告時可以(將建立臨時變數)

若將一級指標變數賦予參照(例如 rp=p),各型別參照可接受的一級指標變數如下表所示。若賦值時等號右邊是函數返回的臨時指標變數(屬於右值),則只有當等號左邊為 int * const & 以及 const int * const & 型別時不會報錯,此時必會建立臨時變數(與 const 左值參照性質一致)。

參照型別 int *變數 const int *變數 int * const變數 const int * const變數
int * &rp 可以 不可以 不可以 不可以
const int * &rp 不可以 可以 不可以 不可以
int * const &rp 宣告時可以 不可以 宣告時可以 不可以
const int * const &rp 宣告時可以(將建立臨時變數) 宣告時可以 宣告時可以(將建立臨時變數) 宣告時可以

若將參照變數賦予參照(例如 rp=rp2),各型別參照可接受的參照變數如下表所示。比較上下兩表可知,左值參照型別變數被初始化完畢後,若要將其賦值給另一參照變數,賦值時的表現與所參照型別的變數相一致。

參照型別 int *&變數 const int *&變數 int * const&變數 const int * const&變數
int * &rp 可以 不可以 不可以 不可以
const int * &rp 不可以 可以 不可以 不可以
int * const &rp 宣告時可以 不可以 宣告時可以 不可以
const int * const &rp 宣告時可以(將建立臨時變數) 宣告時可以 宣告時可以(將建立臨時變數) 宣告時可以