關於C/C++中的NULL和C++11新引進的nullptr
阿新 • • 發佈:2019-01-02
C/C++使用NULL來表示空指標,它是一個巨集定義,其實質就是0,表示不指向任何記憶體地址的空指標。
VC中的NULL定義在vcruntime.h中。
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
在C++中NULL直接定義為0,而在C裡,NULL是定義為(void*)0的,這也很好理解,C語言可以隱式轉換,而C++卻是需要顯示的寫出型別轉換的。像int *p = (void *) 0;這樣的語句,在C++裡是會報錯的,於是在C++中,就乾脆直接將NULL定義為0。於是問題就來了,直接定義為0,一個int型的字面量,那麼在函式過載時,必定會出現非預期的結果,比如以下這段程式碼:
#include <iostream>
using namespace std;
void func(int a)
{
cout << "func int" << endl;
}
void func(char* a)
{
cout << "func char*" << endl;
}
int main()
{
func(NULL);
return 0;
}
呼叫處func(NULL)我們希望呼叫的是func(char *a)函式,然而實際上,結果卻是:func int
將函式呼叫處改為func(nullptr),結果是:
func char*
使用nullptr關鍵字代替NULL巨集定義。