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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

C++?右值引用與?const?關(guān)鍵字詳解_C 語(yǔ)言

作者:木三百川 ? 更新時(shí)間: 2022-11-20 編程語(yǔ)言

C++中的const關(guān)鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,const關(guān)鍵字是一種修飾符。修飾符本身,并不產(chǎn)生任何實(shí)際代碼。就 const 修飾符而言,它用來(lái)告訴編譯器,被修飾的這些東西,具有只讀的特點(diǎn)。在編譯的過(guò)程中,一旦我們的代碼試圖去改變這些東西,編譯器就應(yīng)該給出錯(cuò)誤提示。

C++11 新增了另一種引用:右值引用(rvalue reference),這種引用可指向右值,是使用 && 聲明的。使用右值引用可以減少?gòu)?fù)制操作,延長(zhǎng)臨時(shí)對(duì)象生命周期,提升程序性能。它一般被用來(lái)實(shí)現(xiàn)移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā),將 const 關(guān)鍵字用于右值引用的場(chǎng)景不多,這里來(lái)總結(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ì)象生命周期,提升程序性能。它一般被用來(lái)實(shí)現(xiàn)移動(dòng)語(yǔ)義和完美轉(zhuǎn)發(fā),將 const 關(guān)鍵字用于右值引用的場(chǎng)景不多,這里來(lái)總結(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 右值引用的特性如下:

  • 類(lèi)型為 int && 的引用只能用來(lái)引用右值,不能用來(lái)引用左值,后面可修改其值??蓪㈩?lèi)型為 int 的非左值(比如字面常量 100、多項(xiàng)表達(dá)式 1+50*2、函數(shù)的 int 返回值)、類(lèi)型不是 int 但可轉(zhuǎn)換為 int 的非左值(比如多項(xiàng)表達(dá)式 1.0+50.0*2.0、字面常量 100.0、函數(shù)的 double 返回值)在初始化時(shí)賦給 rrx。變量初始化完成后,其地址就固定不變,其表現(xiàn)與 int 類(lèi)型變量一致,右值引用變量自身屬于左值。
  • 類(lèi)型為 const int && 的引用也只能用來(lái)引用右值,不能用來(lái)引用左值,但后面不可修改其值。可將類(lèi)型為 int 的非左值(比如字面常量 100、多項(xiàng)表達(dá)式 1+50*2、函數(shù)的 int 返回值)、類(lèi)型不是 int 但可轉(zhuǎn)換為 int 的非左值(比如多項(xiàng)表達(dá)式 1.0+50.0*2.0、字面常量 100.0、函數(shù)的 double 返回值)在初始化時(shí)賦給 crrx。變量初始化完成后,其地址就固定不變,其表現(xiàn)與 const int 類(lèi)型變量一致,自身也屬于左值。

常規(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 來(lái)初始化右值引用變量),然后將右值引用變量作為該臨時(shí)變量的別名,這與 const 左值引用十分相似,但與之不同的是:const 左值引用變量初始化完成后其值就無(wú)法被修改(權(quán)限為只讀),右值引用變量初始化完成后其值仍可修改(權(quán)限為可讀可寫(xiě))。在另一些情況下,右值引用可以延長(zhǎng)已有臨時(shí)變量的生命周期,減少?gòu)?fù)制操作的次數(shù)(一個(gè)典型例子是使用函數(shù)返回的類(lèi)對(duì)象來(lái)初始化右值引用變量,在關(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 &&?類(lèi)型 const int &&?類(lèi)型
int?變量 不可以 不可以
const int?變量 不可以 不可以
int &?變量 不可以 不可以
const int &?變量 不可以 不可以
int &&?變量 不可以 不可以
const int &&?變量 不可以 不可以
形如?100?的?int?字面常量 可以 可以
形如?1+50*2?的?int?多項(xiàng)表達(dá)式 可以 可以
返回類(lèi)型為?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è)角度來(lái)說(shuō):

?1.const 定義的常數(shù)是變量 也帶類(lèi)型, #define 定義的只是個(gè)常數(shù) 不帶類(lèi)型。

2. define是在編譯的預(yù)處理階段起作用,而const是在 編譯、運(yùn)行的時(shí)候起作用。

3.define只是簡(jiǎn)單的字符串替換,沒(méi)有類(lèi)型檢查。而const有對(duì)應(yīng)的數(shù)據(jù)類(lèi)型,是要進(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)替換掉了

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

欄目分類(lèi)
最近更新