詳解C++?左值引用與?const?關(guān)鍵字
左值引用是已定義的變量的別名,其主要用途是用作函數(shù)的形參,將 const 關(guān)鍵字用于左值引用時,其在初始化時可接受的賦值形式變得更加廣泛了,這里來總結(jié)一下。
左值引用是已定義的變量的別名,其主要用途是用作函數(shù)的形參,通過將左值引用變量用作參數(shù),函數(shù)將使用原始數(shù)據(jù),而不是副本。引用變量必須在聲明時同時初始化,可將 const
關(guān)鍵字用于左值引用,如下所示:
//聲明并初始化常規(guī)左值引用變量 int x = 55; int & rx = x; //將const關(guān)鍵字用于左值引用變量,以下幾種為等效表示 int x = 55; const int & crx = x; int const & crx = x;
在 Microsoft Visual Studio 中連續(xù)多個 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 為準(zhǔn)):
- 類型為
int &
的引用rx
只能作為已有變量的別名,不會生成臨時變量,可修改所引用變量的值,可將int
變量、int &
變量、int *
指針?biāo)缸兞俊?code>int *const 指針?biāo)缸兞吭诔跏蓟瘯r賦給rx
(接受可通過地址訪問的非const
變量),必須在聲明時初始化,后續(xù)無法更換所引用的變量。變量初始化完成后,其表現(xiàn)與int
類型一致。 - 類型為
const int &
的引用crx
既可作為已有變量的別名,也可在合適的時候生成臨時變量,成為該臨時變量的別名,但不可修改所引用變量的值,可將int
變量、const int
變量、int &
變量、const int &
變量、int *
指針?biāo)缸兞俊?code>int *const 指針?biāo)缸兞俊?code>const int * 指針?biāo)缸兞俊㈩愋蜑?int
的非左值(比如字面常量100
、多項表達(dá)式1+50*2
、函數(shù)的int
返回值)、類型不是int
但可轉(zhuǎn)換為int
的變量或非左值(比如short
變量、short &
變量、多項表達(dá)式1.0+50.0*2.0
、字面常量100.0
、函數(shù)的double
返回值)在初始化時賦給crx
,也必須在聲明時初始化,后續(xù)無法更換所引用的變量。變量初始化完成后,其表現(xiàn)與const int
類型一致。
常規(guī)左值引用變量的初始化用法如下:
//初始化用法一:作為short變量別名 short x = 55; short & rx = x; cout << x; //結(jié)果為55 cout << rx; //結(jié)果為55 cout << &x; //32位系統(tǒng)結(jié)果為0x0093F7BC cout << ℞//32位系統(tǒng)結(jié)果為0x0093F7BC cout << sizeof(x); //結(jié)果為2 cout << sizeof(rx);//結(jié)果為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
關(guān)鍵字修飾的左值引用變量初始化用法如下:
//初始化用法一:作為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; //初始化用法九:將創(chuàng)建臨時變量,類型為int的非左值,字面常量 const int & rx = 100; //初始化用法十:將創(chuàng)建臨時變量,類型為int的非左值,多項表達(dá)式 const int & rx = 1+50*2; //初始化用法十一:將創(chuàng)建臨時變量,類型為int的非左值,函數(shù)返回int值 const int & rx = abs(10); //初始化用法十二:將創(chuàng)建臨時變量,類型不是int但可轉(zhuǎn)換為int的變量 short x = 55; const int & rx = x; cout << x; //結(jié)果為55 cout << rx; //結(jié)果為55 cout << &x; //32位系統(tǒng)結(jié)果為0x006FFCF0 cout << ℞//32位系統(tǒng)結(jié)果為0x006FFCD8 cout << sizeof(x); //結(jié)果為2 cout << sizeof(rx);//結(jié)果為4 //初始化用法十三:將創(chuàng)建臨時變量,類型不是int但可轉(zhuǎn)換為int的非左值,字面常量 const int & rx = 100.0; //初始化用法十四:將創(chuàng)建臨時變量,類型不是int但可轉(zhuǎn)換為int的非左值,多項表達(dá)式 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 字面常量 | 不可以 | 可以(將創(chuàng)建臨時變量) |
形如 1+50*2 的 int 多項表達(dá)式 | 不可以 | 可以(將創(chuàng)建臨時變量) |
返回類型為 int 的函數(shù)返回值 | 不可以 | 可以(將創(chuàng)建臨時變量) |
類型可以轉(zhuǎn)換為 int 的變量 | 不可以 | 可以(將創(chuàng)建臨時變量) |
形如 100.0 可轉(zhuǎn)換為 int 的字面常量 | 不可以 | 可以(將創(chuàng)建臨時變量) |
形如 1.0+50.0*2.0 可轉(zhuǎn)換為 int 的多項表達(dá)式 | 不可以 | 可以(將創(chuàng)建臨時變量) |
到此這篇關(guān)于C++ 左值引用與 const 關(guān)鍵字的文章就介紹到這了,更多相關(guān)C++ 左值引用const 關(guān)鍵字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中一維數(shù)組與指針的關(guān)系詳細(xì)總結(jié)
以下是對C++中一維數(shù)組與指針的關(guān)系進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下2013-09-09c++基礎(chǔ)語法:構(gòu)造函數(shù)初始化列表
構(gòu)造函數(shù)需要初始化的數(shù)據(jù)成員,不論是否顯示的出現(xiàn)在構(gòu)造函數(shù)的成員初始化列表中,都會在該處完成初始化,并且初始化的順序和其在聲明時的順序是一致的,與列表的先后順序無關(guān)2013-09-09馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現(xiàn)代碼
這篇文章主要介紹了馬爾可夫鏈算法(markov算法)的awk、C++、C語言實現(xiàn)代碼,需要的朋友可以參考下2014-08-08