C++98中的空值nullptr

平時我們所用的空值是: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)所佔的字節數相同。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章