本篇部落格會寫c++11標準的中的乙個新特性nullptr,並解釋它的使用方法。
在我們平時宣告乙個變數時,一般會給變數乙個初始值,例如:
void
testptr()
這個null實際上就是乙個巨集,在傳統的c標頭檔案(stddef.h)中:
#ifndef null
#ifdef __cplusplus
#define null 0
//被定義為0
#else
#define null ((void *)0)
//被定義為無型別指標(void*)的常量
#endif
#endif
可以看到,null可能被定義為字面常量0,或者被定義為無型別指標(void*)的常量。不論採取何種定義,在
使用空值的指標時,都不可避免的會遇到一些麻煩 。比如:
voidf(
int)
voidf(
int*
)int
mian()
執行結果如下:
結果可能和我們想的有些不同,這就是問題所在。f(0)我們肯定知道會呼叫第乙個函式,但是f(null)我們覺得它會呼叫第二個函式,因為它傳的是乙個指標,但是結果卻是呼叫了第乙個函式,因為null被定義為了字面常量0,編譯器預設情況下將null看做乙個整型常量,如果要將其按照指標方式使用,必須對其強轉成(void*)0,所以c++11中引入nullptr。
voidf(
int)
voidf(
int*
)int
mian()
這個時候執行結果就是和我們想的一樣了
為了考慮相容性,c++11並沒有消除常量0的二義性,c++11給出了全新的nullptr表示空值指標。c++11為什麼不在null的基礎上進行擴充套件,這是因為null以前就是乙個巨集,而且不同的編譯器廠商對於null的實現可能不太相同,而且直接擴充套件null,可能會影響以前舊的程式。因此為了避免混淆,c++11提供了nullptr即nullptr代表乙個指標空值常量。nullptr是有型別的,其型別為nullptr_t,僅僅可以被隱式轉化為指標型別,nullptr_t被定義在標頭檔案中:
typedef
decltype
(nullptr
) nullptr_t;
我們直接看一看nullptr的型別會更加直觀
int
main()
可以得到nullptr的型別是nullptr_t,是在標準庫標頭檔案裡的。
有三點需要注意:
1.在使用nullptr表示指標空值時,不需要包含標頭檔案,因為nullptr是c++11作為新關鍵字引入的。
2.在c++11中,sizeof(nullptr) 與 sizeof((void*)0)所佔的位元組數相同。
3.為了提高**的健壯性,在後續表示指標空值時建議最好使用nullptr。
CPP11新特性 指標空值nullptr
在良好的c c 程式設計習慣中,宣告乙個變數時最好給該變數乙個合適的初始值,否則可能會出現不可預料的錯誤,比如未初始化的指標。如果乙個指標沒有合法的指向,我們基本就是按照如下方式對其進行初始化 void testptr null實際是乙個巨集,在傳統的c標頭檔案 stdef.h 中,可以看到如下 i...
C 指標空值nullptr
在良好的c c 程式設計習慣中,宣告乙個變數時應該給該變數乙個合適的初始值,否則可能會出現不可預料的錯誤,比如未初始化的指標。如果乙個指標沒有合法的指向,我們基本都是按照如下方式對其進行初始化 void testptr null實際是乙個巨集。null可能被定義為字面常量0,或者被定義為無型別指標 ...
C 11 智慧型指標和空指標
nullptr 空指標是不會指向有效資料的指標,以前用 0表示,但是這使得 0既可表示指標常量,又可表示整型常量。c 11 仍允許使用 0來表示空指標,因此表示式 nullptr 0 為true 使用nullptr 表示空指標而不是 0提供了更高的型別安全。智慧型指標 如果指標 ps有乙個析構函式,...