網(wǎng)站首頁 編程語言 正文
C++中的const關鍵字的用法非常靈活,而使用const將大大改善程序的健壯性,const關鍵字是一種修飾符。修飾符本身,并不產生任何實際代碼。就 const 修飾符而言,它用來告訴編譯器,被修飾的這些東西,具有只讀的特點。在編譯的過程中,一旦我們的代碼試圖去改變這些東西,編譯器就應該給出錯誤提示。
C++11 新增了另一種引用:右值引用(rvalue reference),這種引用可指向右值,是使用 && 聲明的。使用右值引用可以減少復制操作,延長臨時對象生命周期,提升程序性能。它一般被用來實現(xiàn)移動語義和完美轉發(fā),將 const 關鍵字用于右值引用的場景不多,這里來總結一下 const 右值引用的特性,對其是否具有實際應用價值不做討論。右值引用必須在創(chuàng)建的同時進行初始化,且只能使用右值進行初始化,可將 const 關鍵字用于右值引用,如下所示。
C++11 新增了另一種引用:右值引用(rvalue reference),這種引用可指向右值,是使用 &&
聲明的。使用右值引用可以減少復制操作,延長臨時對象生命周期,提升程序性能。它一般被用來實現(xiàn)移動語義和完美轉發(fā),將 const
關鍵字用于右值引用的場景不多,這里來總結一下 const
右值引用的特性,對其是否具有實際應用價值不做討論。右值引用必須在創(chuàng)建的同時進行初始化,且只能使用右值進行初始化,可將 const
關鍵字用于右值引用,如下所示:
//聲明并初始化常規(guī)右值引用變量 int && rrx = 55; //將const關鍵字用于右值引用變量,以下幾種為等效表示 const int && crrx = 55; int const && crrx = 55;
在 Microsoft Visual Studio 中連續(xù)多個 const
會被編譯器解釋成一個,即 const const const const int &&
與 const int &&
等效,除此之外,const int const &&
在 Microsoft Visual Studio 中也與 const int &&
等效,而 int && const
在 QT minGW 中將會報錯,在 Microsoft Visual Studio 中與 int &&
等效。
常規(guī)右值引用與 const
右值引用的特性如下:
- 類型為
int &&
的引用只能用來引用右值,不能用來引用左值,后面可修改其值。可將類型為int
的非左值(比如字面常量100
、多項表達式1+50*2
、函數(shù)的int
返回值)、類型不是int
但可轉換為int
的非左值(比如多項表達式1.0+50.0*2.0
、字面常量100.0
、函數(shù)的double
返回值)在初始化時賦給rrx
。變量初始化完成后,其地址就固定不變,其表現(xiàn)與int
類型變量一致,右值引用變量自身屬于左值。 - 類型為
const int &&
的引用也只能用來引用右值,不能用來引用左值,但后面不可修改其值。可將類型為int
的非左值(比如字面常量100
、多項表達式1+50*2
、函數(shù)的int
返回值)、類型不是int
但可轉換為int
的非左值(比如多項表達式1.0+50.0*2.0
、字面常量100.0
、函數(shù)的double
返回值)在初始化時賦給crrx
。變量初始化完成后,其地址就固定不變,其表現(xiàn)與const int
類型變量一致,自身也屬于左值。
常規(guī)右值引用變量的初始化用法如下:
//初始化方式一:字面常量 int && rrx = 100; int && rrx = 100.0; //初始化方式二:多項表達式 int && rrx = 1+50*2; int && rrx = 1.0+50.0*2.0; //初始化方式二:函數(shù)返回值 int && rrx = abs(10); int && rrx = sqrt(10.0);
右值引用在部分情況下會生成臨時變量(一個典型例子是使用字面常量右值如 100
來初始化右值引用變量),然后將右值引用變量作為該臨時變量的別名,這與 const
左值引用十分相似,但與之不同的是:const
左值引用變量初始化完成后其值就無法被修改(權限為只讀),右值引用變量初始化完成后其值仍可修改(權限為可讀可寫)。在另一些情況下,右值引用可以延長已有臨時變量的生命周期,減少復制操作的次數(shù)(一個典型例子是使用函數(shù)返回的類對象來初始化右值引用變量,在關閉編譯器優(yōu)化的情況下可以將本需 2 次的復制操作減少為 1 次)。
被 const
關鍵字修飾的右值引用變量初始化用法如下,與常規(guī)右值引用變量的區(qū)別僅在于它們的可修改屬性不同。
//初始化方式一:字面常量 const int && crrx = 100; const int && crrx = 100.0; //初始化方式二:多項表達式 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);
將初始化時 int &&
與 const int &&
可接受的形式列個表,如下,需要注意的是:可以將右值引用變量用于初始化左值引用變量,但不可將左值引用變量用于初始化右值引用變量,因為右值引用變量自身屬于左值。
初始化時可接受的形式 |
int && ?類型
|
const int && ?類型
|
---|---|---|
int ?變量 |
不可以 | 不可以 |
const int ?變量 |
不可以 | 不可以 |
int & ?變量 |
不可以 | 不可以 |
const int & ?變量 |
不可以 | 不可以 |
int && ?變量 |
不可以 | 不可以 |
const int && ?變量 |
不可以 | 不可以 |
形如?100 ?的?int ?字面常量 |
可以 | 可以 |
形如?1+50*2 ?的?int ?多項表達式 |
可以 | 可以 |
返回類型為?int ?的函數(shù)返回值 |
可以 | 可以 |
形如?100.0 ?可轉換為?int ?的字面常量 |
可以 | 可以 |
形如?1.0+50.0*2.0 ?可轉換為?int ?的多項表達式 |
可以 | 可以 |
擴展const常量與宏定義的常量的區(qū)別:
這個區(qū)別用從幾個角度來說:
?1.const 定義的常數(shù)是變量 也帶類型, #define 定義的只是個常數(shù) 不帶類型。
2. define是在編譯的預處理階段起作用,而const是在 編譯、運行的時候起作用。
3.define只是簡單的字符串替換,沒有類型檢查。而const有對應的數(shù)據(jù)類型,是要進行判斷的,可以避免一些低級的錯誤。?
由于define只是簡單的字符串替換會導致邊界效應,具體舉例可以參考下面代碼:
#define N 2+3 //我們預想的N值是5,我們這樣使用N
double a = N/2; ?//我們預想的a的值是2.5,可實際上a的值是3.5
4.占用的空間不同
#define PI 3.14 ? ? //預處理后 占用代碼段空間 const float PI=3.14; ? ?//本質上還是一個 float,占用數(shù)據(jù)段空間
5. const常量可以進行調試的,define是不能進行調試的,因為在預編譯階段就已經(jīng)替換掉了
原文鏈接:https://www.cnblogs.com/young520/p/16767851.html
相關推薦
- 2022-12-29 一文帶你了解Go語言中方法的調用_Golang
- 2023-02-12 一文帶你了解Golang中reflect反射的常見錯誤_Golang
- 2023-05-06 如何設置docker開機自啟動,并設置容器自動重啟_docker
- 2023-03-13 Android?BottomNavigationView與Fragment重建與重疊問題解決方法探索
- 2022-12-08 Python如何遍歷numpy數(shù)組_python
- 2022-02-25 image-webpack-loader 報錯 Invalid regular expression
- 2022-05-15 Element框架里日期選擇器限制時間,最多選31天
- 2022-06-10 ASP.NET?Core使用AutoMapper組件_實用技巧
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支