C++?右值引用與?const?關(guān)鍵字詳解
C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,const關(guān)鍵字是一種修飾符。修飾符本身,并不產(chǎn)生任何實(shí)際代碼。就 const 修飾符而言,它用來告訴編譯器,被修飾的這些東西,具有只讀的特點(diǎn)。在編譯的過程中,一旦我們的代碼試圖去改變這些東西,編譯器就應(yīng)該給出錯(cuò)誤提示。
C++11 新增了另一種引用:右值引用(rvalue reference),這種引用可指向右值,是使用 && 聲明的。使用右值引用可以減少?gòu)?fù)制操作,延長(zhǎng)臨時(shí)對(duì)象生命周期,提升程序性能。它一般被用來實(shí)現(xiàn)移動(dòng)語義和完美轉(zhuǎn)發(fā),將 const 關(guān)鍵字用于右值引用的場(chǎng)景不多,這里來總結(jié)一下 const 右值引用的特性,對(duì)其是否具有實(shí)際應(yīng)用價(jià)值不做討論。右值引用必須在創(chuàng)建的同時(shí)進(jìn)行初始化,且只能使用右值進(jìn)行初始化,可將 const 關(guān)鍵字用于右值引用,如下所示。
C++11 新增了另一種引用:右值引用(rvalue reference),這種引用可指向右值,是使用 &&
聲明的。使用右值引用可以減少?gòu)?fù)制操作,延長(zhǎng)臨時(shí)對(duì)象生命周期,提升程序性能。它一般被用來實(shí)現(xiàn)移動(dòng)語義和完美轉(zhuǎn)發(fā),將 const
關(guān)鍵字用于右值引用的場(chǎng)景不多,這里來總結(jié)一下 const
右值引用的特性,對(duì)其是否具有實(shí)際應(yīng)用價(jià)值不做討論。右值引用必須在創(chuàng)建的同時(shí)進(jìn)行初始化,且只能使用右值進(jìn)行初始化,可將 const
關(guān)鍵字用于右值引用,如下所示:
//聲明并初始化常規(guī)右值引用變量 int && rrx = 55; //將const關(guān)鍵字用于右值引用變量,以下幾種為等效表示 const int && crrx = 55; int const && crrx = 55;
在 Microsoft Visual Studio 中連續(xù)多個(gè) const
會(huì)被編譯器解釋成一個(gè),即 const const const const int &&
與 const int &&
等效,除此之外,const int const &&
在 Microsoft Visual Studio 中也與 const int &&
等效,而 int && const
在 QT minGW 中將會(huì)報(bào)錯(cuò),在 Microsoft Visual Studio 中與 int &&
等效。
常規(guī)右值引用與 const
右值引用的特性如下:
- 類型為
int &&
的引用只能用來引用右值,不能用來引用左值,后面可修改其值??蓪㈩愋蜑?int
的非左值(比如字面常量100
、多項(xiàng)表達(dá)式1+50*2
、函數(shù)的int
返回值)、類型不是int
但可轉(zhuǎn)換為int
的非左值(比如多項(xiàng)表達(dá)式1.0+50.0*2.0
、字面常量100.0
、函數(shù)的double
返回值)在初始化時(shí)賦給rrx
。變量初始化完成后,其地址就固定不變,其表現(xiàn)與int
類型變量一致,右值引用變量自身屬于左值。 - 類型為
const int &&
的引用也只能用來引用右值,不能用來引用左值,但后面不可修改其值。可將類型為int
的非左值(比如字面常量100
、多項(xiàng)表達(dá)式1+50*2
、函數(shù)的int
返回值)、類型不是int
但可轉(zhuǎn)換為int
的非左值(比如多項(xiàng)表達(dá)式1.0+50.0*2.0
、字面常量100.0
、函數(shù)的double
返回值)在初始化時(shí)賦給crrx
。變量初始化完成后,其地址就固定不變,其表現(xiàn)與const int
類型變量一致,自身也屬于左值。
常規(guī)右值引用變量的初始化用法如下:
//初始化方式一:字面常量 int && rrx = 100; int && rrx = 100.0; //初始化方式二:多項(xiàng)表達(dá)式 int && rrx = 1+50*2; int && rrx = 1.0+50.0*2.0; //初始化方式二:函數(shù)返回值 int && rrx = abs(10); int && rrx = sqrt(10.0);
右值引用在部分情況下會(huì)生成臨時(shí)變量(一個(gè)典型例子是使用字面常量右值如 100
來初始化右值引用變量),然后將右值引用變量作為該臨時(shí)變量的別名,這與 const
左值引用十分相似,但與之不同的是:const
左值引用變量初始化完成后其值就無法被修改(權(quán)限為只讀),右值引用變量初始化完成后其值仍可修改(權(quán)限為可讀可寫)。在另一些情況下,右值引用可以延長(zhǎng)已有臨時(shí)變量的生命周期,減少?gòu)?fù)制操作的次數(shù)(一個(gè)典型例子是使用函數(shù)返回的類對(duì)象來初始化右值引用變量,在關(guān)閉編譯器優(yōu)化的情況下可以將本需 2 次的復(fù)制操作減少為 1 次)。
被 const
關(guān)鍵字修飾的右值引用變量初始化用法如下,與常規(guī)右值引用變量的區(qū)別僅在于它們的可修改屬性不同。
//初始化方式一:字面常量 const int && crrx = 100; const int && crrx = 100.0; //初始化方式二:多項(xiàng)表達(dá)式 const int && crrx = 1+50*2; const int && crrx = 1.0+50.0*2.0; //初始化方式二:函數(shù)返回值 const int && crrx = abs(10); const int && crrx = sqrt(10.0);
將初始化時(shí) int &&
與 const int &&
可接受的形式列個(gè)表,如下,需要注意的是:可以將右值引用變量用于初始化左值引用變量,但不可將左值引用變量用于初始化右值引用變量,因?yàn)橛抑狄米兞孔陨韺儆谧笾怠?/p>
初始化時(shí)可接受的形式 | int && 類型 | const int && 類型 |
---|---|---|
int 變量 | 不可以 | 不可以 |
const int 變量 | 不可以 | 不可以 |
int & 變量 | 不可以 | 不可以 |
const int & 變量 | 不可以 | 不可以 |
int && 變量 | 不可以 | 不可以 |
const int && 變量 | 不可以 | 不可以 |
形如 100 的 int 字面常量 | 可以 | 可以 |
形如 1+50*2 的 int 多項(xiàng)表達(dá)式 | 可以 | 可以 |
返回類型為 int 的函數(shù)返回值 | 可以 | 可以 |
形如 100.0 可轉(zhuǎn)換為 int 的字面常量 | 可以 | 可以 |
形如 1.0+50.0*2.0 可轉(zhuǎn)換為 int 的多項(xiàng)表達(dá)式 | 可以 | 可以 |
擴(kuò)展const常量與宏定義的常量的區(qū)別:
這個(gè)區(qū)別用從幾個(gè)角度來說:
1.const 定義的常數(shù)是變量 也帶類型, #define 定義的只是個(gè)常數(shù) 不帶類型。
2. define是在編譯的預(yù)處理階段起作用,而const是在 編譯、運(yùn)行的時(shí)候起作用。
3.define只是簡(jiǎn)單的字符串替換,沒有類型檢查。而const有對(duì)應(yīng)的數(shù)據(jù)類型,是要進(jìn)行判斷的,可以避免一些低級(jí)的錯(cuò)誤。
由于define只是簡(jiǎn)單的字符串替換會(huì)導(dǎo)致邊界效應(yīng),具體舉例可以參考下面代碼:
#define N 2+3 //我們預(yù)想的N值是5,我們這樣使用N
double a = N/2; //我們預(yù)想的a的值是2.5,可實(shí)際上a的值是3.5
4.占用的空間不同
#define PI 3.14 ? ? //預(yù)處理后 占用代碼段空間 const float PI=3.14; ? ?//本質(zhì)上還是一個(gè) float,占用數(shù)據(jù)段空間
5. const常量可以進(jìn)行調(diào)試的,define是不能進(jìn)行調(diào)試的,因?yàn)樵陬A(yù)編譯階段就已經(jīng)替換掉了
到此這篇關(guān)于C++ 右值引用與 const 關(guān)鍵字的文章就介紹到這了,更多相關(guān)C++ 右值引用const 關(guān)鍵字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++知識(shí)點(diǎn)之成員函數(shù)中const的用法
這篇文章主要介紹了C++知識(shí)點(diǎn)之成員函數(shù)中const的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11C語言一看就懂的選擇與循環(huán)語句及函數(shù)介紹
函數(shù)是一個(gè)功能模塊,它把實(shí)現(xiàn)某個(gè)功能的代碼塊包含起來,并起一個(gè)函數(shù)名,供別人調(diào)用,如printf函數(shù),如system函數(shù)。是程序運(yùn)行當(dāng)中包裝起來的一個(gè)步驟;選擇與循環(huán)是編程中最常用的結(jié)構(gòu),本篇文章用最簡(jiǎn)單的文字帶你了解它們2022-04-04C語言字符串函數(shù)介紹與模擬實(shí)現(xiàn)詳解
字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長(zhǎng)度,字符查找等的函數(shù)2022-02-02Qt實(shí)現(xiàn)手動(dòng)切換多種布局的完美方案
通過點(diǎn)擊程序界面上不同的布局按鈕,使主工作區(qū)呈現(xiàn)出不同的頁面布局,多個(gè)布局之間可以通過點(diǎn)擊不同布局按鈕切換,支持的最多的窗口為9個(gè),不同布局下窗口數(shù)隨之變化,這篇文章主要介紹了Qt實(shí)現(xiàn)手動(dòng)切換多種布局的完美方案,需要的朋友可以參考下2024-07-07C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例
這篇文章主要介紹了C++面試題之進(jìn)制轉(zhuǎn)換的實(shí)例的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這樣的知識(shí),需要的朋友可以參考下2017-10-10C語言實(shí)現(xiàn)循環(huán)單鏈表的示例代碼
這篇文章主要給大家詳細(xì)介紹了C語言如何實(shí)現(xiàn)循環(huán)單鏈表,文章通過代碼示例講解的非常詳細(xì),對(duì)我們的學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的小伙伴跟著小編一起來看看吧2023-08-08C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05