C++ NULL nullptr和0的区别
C中的NULL
在C語言中我們將NULL用作空指針之用,NULL在C語言中的定義如下:
#define NULL ((void *)0)可以看到,C語言中NULL是一個void*指針,我們常用其來對指針變量進行初始化賦值或者作為返回類型為指針的函數的返回值(如函數執行失敗時)等等。
C++中的NULL
在C++中,NULL的定義如下:
/* Define NULL pointer value */ #ifndef NULL#ifdef __cplusplus#define NULL 0#else /* __cplusplus */#define NULL ((void *)0)#endif /* __cplusplus */ #endif /* NULL */可以看到,在C++中,NULL被定義為0,而不是(void*)0,為什么C++在NULL的定義上不繼續兼容C延續(void*)0的定義呢?因為C++中不能將void類型的指針隱式轉換成其他指針類型,所以將NULL定義為(void)0的話并不能起到空指針的作用.
因為C++中不能將void類型的指針隱式轉換成其他指針類型,所以用(void)0對其他類型指針賦初值是不行的。既然(void*)0不能起到空指針的作用,不如干脆將NULL定義為0,引入0來表示空指針,可以對各種類型的指針進行賦值。
C++中的nullptr
C++中有個nullptr的關鍵字可以用作空指針,既然已經有了定義為0的NULL,為何還要nullptr呢?這是因為定義為0的NULL很容易引起混淆,尤其是函數重載調用時.
void hello(char* a) {printf("char\n"); } void hello(int a) {printf("int\n"); }int main() {hello(NULL); //調用hello(int a)函數return 0; }如果在C++中還是用NULL來用作空指針的話,我們會以為hello(NULL)調用的是hello(char* a),但實際上,因為NULL定義為0,所以調用的是hello(int a)。所以為了避免這種混淆,C++定義了nullptr關鍵字用作空指針。
nullptr的使用
nullptr關鍵字用于標識空指針,是std::nullptr_t類型的(constexpr)變量。它可以轉換成任何指針類型和bool布爾類型(主要是為了兼容普通指針可以作為條件判斷語句的寫法),但是不能被轉換為整數。
注意nullptr和NULL以及0在作為條件判斷時值都為false,它們兩兩之間進行等于(==)判斷時值為true。
總結
以上是生活随笔為你收集整理的C++ NULL nullptr和0的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ c_str()
- 下一篇: C++ map 中的reverse_it