一.nullptr 示例: #include void foo(char * c){}void foo(int n){}int main(){foo(0);// foo(NULL); // ... ...
一.nullptr
示例:
#include
<iostream> |
foo(NULL)無法編譯通過,因為編譯器不知道NULL隱式轉換為哪個類型的參數來調用。
所以,當需要使用 NULL 時候,請養成直接使用 nullptr 的習慣。
二.constexpr
C++11新標準規定,允許將變數或函數聲明為constexpr類型,由編譯器來驗證變數的值是否是一個常量表達式。
聲明為constexpr的變數一定是一個常量,而且必須用常量表達式初始化
1.constexpr修飾函數
constexpr
int
sub(int
i) |
2.constexpr修飾類
constexpr可以修飾類的構造函數
即:保證傳遞給該構造函數的所有參數都是constexpr,那麼產生的對象的所有成員都是constexpr。
該對象也是constexpr對象了,可用於只使用constexpr的場合。
**註意**constexpr構造函數的函數體必須為空,所有成員變數的初始化都放到初始化列表中。
class
Test |
3.constexpr遞歸函數
constexpr
int
fibonacci(const
int
n) |
從 C++14 開始,constexptr 函數可以在內部使用局部變數、迴圈和分支等簡單語句
例如下麵的代碼在 C++11 的標準下是不能夠通過編譯的
constexpr
int
fibonacci(const
int
n) |
4.使用constexpr的好處:
- 很強的約束,保證程式的正確定義不被破壞;
- 編譯器對constexper代碼進行了優化,例如:將用到的constexpr表達式直接替換成結果;
- 相比巨集來說沒有額外的開銷。