平時我們所用的空值是:NULL;在傳統的C頭文件(stddef.h)中,可以看到如下代碼:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else #define NULL ((void *)0)
#endif
#endif
NULL可能被定義爲字面常量0,或者被定義爲無類型指針(void*)的常量。
下面就會引起一個問題:
void f(int) { cout<<"f(int)"<<endl; }
void f(int*) { cout<<"f(int*)"<<endl; }
int main() {
f(0);
f(NULL);
f((int*)NULL);
return 0;
}
程序本意是想通過f(NULL)調用指針版本的f(int*)函數,但是由於NULL被定義成0或者(void*)類型的函數,因此與程序的初衷相悖。
實際是按0編譯的;編譯器默認情況下將其看成是一個整形常量,如果要將其按照指針方式來使用,必須對其進行強轉(void *)0。
爲了考慮兼容性,C++11給出了全新的nullptr表示空值指針。:爲了避免混淆,C++11提供了nullptr, 即:nullptr代表一個指針空值常量。nullptr是有類型的,其類型爲nullptr_t,僅僅可以被隱式轉化爲指針類型,nullptr_t被定義在頭文件中:typedef decltype(nullptr) nullptr_t;
注意:
- 1. 在使用nullptr表示指針空值時,不需要包含頭文件,因爲nullptr是C++11作爲新關鍵字引入的。
- 2. 在C++11中,sizeof(nullptr) 與 sizeof((void*)0)所佔的字節數相同。