C語言中NULL是指空指針,通常定義爲
#define NULL ((void *)0)
可以把空指針賦給其他類型的指針,因爲在編譯的時候可以隱式類型轉換。
但是C++的編譯器不允許將void*類型的指針隱式轉換爲其他類型的指針。
所以C++中是這樣定義NULL的
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
所以C++中的NULL實際上是0。
但是如果我們在C++中還是把NULL當成void*來用可能會出問題。
比如下面的函數重載的情況
void myFunc(void* p)
{
std::cout << "call myFunc(void* p)" << std::endl;
}
void myFunc(int p)
{
std::cout << "call myFunc(int p)" << std::endl;
}
int main(int argc, char* argv[])
{
std::cout << "myFunc(NULL) will call function " << std::endl;
myFunc(NULL);
std::cout << "myFunc(nullptr) will call function " << std::endl;
myFunc(nullptr);
system("pause");
return 0;
}
本來想用NULL代表空指針調用myFunc(void* p)函數,實際卻調用了myFunc(int p)。
因此,C++11中引入了nullptr這個關鍵字來表示空指針。上面的nullptr作爲實參確實也正確調用了。