【C++】NULL和nullptr的區別

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作爲實參確實也正確調用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章