左值引用是已定義的變數的別名,其主要用途是用作函數的形參,將 const 關鍵字用於左值引用時,其在初始化時可接受的賦值形式變得更加廣泛了,這裡來總結一下。 ...
左值引用是已定義的變數的別名,其主要用途是用作函數的形參,通過將左值引用變數用作參數,函數將使用原始數據,而不是副本。引用變數必須在聲明時同時初始化,可將 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 & const
在 QT 中將會報錯,在 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 << ℞//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 << ℞//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 所指變數 |
不可以 | 可以 |
形如 100 的 int 字面常量 |
不可以 | 可以(將創建臨時變數) |
形如 1+50*2 的 int 多項表達式 |
不可以 | 可以(將創建臨時變數) |
類型可以轉換為 int 的變數 |
不可以 | 可以(將創建臨時變數) |
形如 100.0 可轉換為 int 的字面常量 |
不可以 | 可以(將創建臨時變數) |
形如 1.0+50.0*2.0 可轉換為 int 的多項表達式 |
不可以 | 可以(將創建臨時變數) |
本文作者:木三百川
本文鏈接:https://www.cnblogs.com/young520/p/16705812.html
版權聲明:本文系博主原創文章,著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請附上出處鏈接。遵循 署名-非商業性使用-相同方式共用 4.0 國際版 (CC BY-NC-SA 4.0) 版權協議。