日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

詳解C++?左值引用與?const?關鍵字_C 語言

作者:木三百川 ? 更新時間: 2022-11-10 編程語言

左值引用是已定義的變量的別名,其主要用途是用作函數的形參,將 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 * 指針所指變量、類型為 int 的非左值(比如字面常量 100、多項表達式 1+50*2、函數的 int 返回值)、類型不是 int 但可轉換為 int 的變量或非左值(比如 short 變量、short & 變量、多項表達式 1.0+50.0*2.0、字面常量 100.0、函數的 double 返回值)在初始化時賦給 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值
const int & rx = abs(10);
 
//初始化用法十二:將創建臨時變量,類型不是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?所指變量 不可以 可以
形如?100?的?int?字面常量 不可以 可以(將創建臨時變量)
形如?1+50*2?的?int?多項表達式 不可以 可以(將創建臨時變量)
返回類型為?int?的函數返回值 不可以 可以(將創建臨時變量)
類型可以轉換為?int?的變量 不可以 可以(將創建臨時變量)
形如?100.0?可轉換為?int?的字面常量 不可以 可以(將創建臨時變量)
形如?1.0+50.0*2.0?可轉換為?int?的多項表達式 不可以 可以(將創建臨時變量)

原文鏈接:https://www.cnblogs.com/young520/p/16705812.html

欄目分類
最近更新