C++ 左值參照與 const 關鍵字

2022-09-19 06:06:14

左值參照是已定義的變數的別名,其主要用途是用作函數的形參,通過將左值參照變數用作引數,函數將使用原始資料,而不是副本。參照變數必須在宣告時同時初始化,可將 const 關鍵字用於左值參照,如下所示:

//宣告並初始化常規左值參照變數
int x = 55;
int & rx = x;

//將const關鍵字用於左值參照變數,以下幾種為等效表示
int x = 55;
const int & crx = x;
int const & crx = x;

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

以上兩種型別左值參照的特性如下(舊版 C++ 可能與下列特性不十分吻合,以 C++11 為準):

  • 型別為 int & 的參照 rx 只能作為已有變數的別名,不會生成臨時變數,可修改所參照變數的值,可將 int 變數、int & 變數、int * 指標所指變數、int *const 指標所指變數在初始化時賦給 rx接受可通過地址存取的非 const 變數),必須在宣告時初始化,後續無法更換所參照的變數。變數初始化完成後,其表現與 int 型別一致。

  • 型別為 const int & 的參照 crx 既可作為已有變數的別名,也可在合適的時候生成臨時變數,成為該臨時變數的別名,但不可修改所參照變數的值,可將 int 變數、const int 變數、int & 變數、const int & 變數、int * 指標所指變數、int *const 指標所指變數、const int * 指標所指變數、const int *const 指標所指變數、型別為 int 的非左值(比如字面常數 100、多項表示式 1+50*2)、型別不是 int 但可轉換為 int 的變數或非左值(比如 short 變數、多項表示式 1.0+50.0*2.0、字面常數 100.0)在初始化時賦給 crx,也必須在宣告時初始化,後續無法更換所參照的變數。變數初始化完成後,其表現與 const int 型別一致。

常規左值參照變數的初始化用法如下:

//初始化用法一:作為short變數別名
short x = 55;
short & rx = x;
cout << x;  //結果為55
cout << rx; //結果為55
cout << &x; //32位元系統結果為0x0093F7BC
cout << &rx;//32位元系統結果為0x0093F7BC
cout << sizeof(x); //結果為2
cout << sizeof(rx);//結果為2

//初始化用法二:作為short變數別名,多層參照
short x = 55;
short & rx = x;
short & rxx = rx;

//初始化用法三:作為short變數別名,指標表示法,指標為short*
short x = 55;
short * px = &x;
short & rx = *px;

//初始化用法四:作為short變數別名,指標表示法,指標為short *const
short x = 55;
short * const px = &x;
short & rx = *px;

const 關鍵字修飾的左值參照變數初始化用法如下:

//初始化用法一:作為short變數別名
short x = 55;
const short & rx = x;

//初始化用法二:作為const short變數別名
const short x = 55;
const short & rx = x;

//初始化用法三:作為short變數別名,多層參照
short x = 55;
short & rx = x;
const short & rxx = rx;

//初始化用法四:作為short變數別名,多層參照,第一層參照為const
short x = 55;
const short & rx = x;
const short & rxx = rx;

//初始化用法五:作為short變數別名,指標表示法,指標為short*
short x = 55;
short * px = &x;
const short & rx = *px;

//初始化用法六:作為short變數別名,指標表示法,指標為const short*
short x = 55;
const short * px = &x;
const short & rx = *px;

//初始化用法七:作為short變數別名,指標表示法,指標為short *const
short x = 55;
short *const px = &x;
const short & rx = *px;

//初始化用法八:作為short變數別名,指標表示法,指標為const short *const
short x = 55;
const short *const px = &x;
const short & rx = *px;

//初始化用法九:將建立臨時變數,型別為int的非左值,字面常數
const int & rx = 100;

//初始化用法十:將建立臨時變數,型別為int的非左值,多項表示式
const int & rx = 1+50*2;

//初始化用法十一:將建立臨時變數,型別不是int但可轉換為int的變數
short x = 55;
const int & rx = x;
cout << x;  //結果為55
cout << rx; //結果為55
cout << &x; //32位元系統結果為0x006FFCF0
cout << &rx;//32位元系統結果為0x006FFCD8
cout << sizeof(x); //結果為2
cout << sizeof(rx);//結果為4

//初始化用法十二:將建立臨時變數,型別不是int但可轉換為int的非左值,字面常數
const int & rx = 100.0;

//初始化用法十三:將建立臨時變數,型別不是int但可轉換為int的非左值,多項表示式
const int & rx = 1.0+50.0*2.0;

將初始化時 int &const int & 可接受的形式列個表,如下:

初始化時可接受的形式 int & 型別 const int & 型別
int 變數 可以 可以
const int 變數 不可以 可以
int & 變數 可以 可以
const int & 變數 不可以 可以
int * 所指變數 可以 可以
int * const 所指變數 可以 可以
const int * 所指變數 不可以 可以
const int * const 所指變數 不可以 可以
形如 100int 字面常數 不可以 可以(將建立臨時變數)
形如 1+50*2int 多項表示式 不可以 可以(將建立臨時變數)
型別可以轉換為 int 的變數 不可以 可以(將建立臨時變數)
形如 100.0 可轉換為 int 的字面常數 不可以 可以(將建立臨時變數)
形如 1.0+50.0*2.0 可轉換為 int 的多項表示式 不可以 可以(將建立臨時變數)