您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++11的const, const expression和constexpr有什么作用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++11的const, const expression和constexpr有什么作用”吧!
const限定符
const可以用于定義變量,它的值不能被改變。
const int bufSize = 512;
如果有代碼試圖修改這個變量,就會發生編譯錯誤。
指針和const
const當然也可以用于修飾指針,但是會帶來一些混亂,例如:
const double pi = 3.14;
const double *cptr = π //指向常數的指針
*cptr = 4; //編譯錯誤
double var = 45;
double *const pvar = &var; //指向變量為常數
*pvar = 40; //正確
不大容易區分到底誰不能變,這時可以試試下面的視角:
const double* cptr = π //指向常數的指針
double* const pvar = &var; //指針變量為常數
常量表達式
const限定符只能保證初始化之后不會被修改,而變量的值是編譯階段就可以確定的還是到執行時才能確定都可以。關于這一點C++中有一個常量表達式的概念,指的是值固定并且在編譯過程就能確定計算結果的表達式。例如:
const int max_files = 20; //20是字面值
const int limit = max_files + 1; //max_files為常量表達式,1是字面值。
const int sz = get_size(); //sz不是常量表達式。
上面的表達式同時滿足兩個條件:一是變量本身為const類型,二是初始值必須為字面值或者常量表達式。
如果變量類型不是const,那么無論它的初始值是不是常量表達式,它就只是一個變量;如果初始值不是常量表達式,那個變量的值就無法在編譯期間得確定只能在執行時占用CPU開銷來賦值。
變量的值在編譯期間決定,帶來的好處就是提高效率,例如例子中的limit的表達方式,在照顧可讀性的同時,又不會影響執行效率。
constexpr變量
一般來說,在日益復雜的系統中確定變量的初始值到底是不是常量表達式并不是一件容易的事。為了解決這個問題C++11允許將變量聲明為constexpr類型以便由編譯器驗證變量的值是否是一個常量表達式。
變量聲明為constexpr類型,就意味著一方面變量本身是常量,也意味著它必須用常量表達式來初始化。
constexpr int mf = 20;
constexpr int limit = mf + 1;
如果初始值不是常量表達式,那么就會發生編譯錯誤。
constexpr函數
除了能用常量表達式初始化constexpr變量以外,還可以使用constexpr函數。它是指能用于常量表達式的函數,也就是說它的計算結果可以在編譯時確定。定義的方法就是在返回值類型前加constexpr關鍵字。但是為了保證計算結果可以在編譯是確定,必須滿足以下條件:
返回值和形參必須都是字面值類型。
函數中只能有一條return語句。
例如下面的計算階乘的constexpr函數。
constexpr long long factorial(int n){
return n <= 1? 1 : (n * factorial(n - 1));
}
constexpr long long f18 = factorial(20);
可以用它來初始化constexpr變量。所有計算都在編譯時完成。比較有趣的是像溢出這樣錯誤也會在編譯是被檢出。
簡單地說
constexpr可以
加強初始值的檢查
計算的時機從運行時提前到編譯時,比宏定義效率更高。
感謝各位的閱讀,以上就是“C++11的const, const expression和constexpr有什么作用”的內容了,經過本文的學習后,相信大家對C++11的const, const expression和constexpr有什么作用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。