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作为实参确实也正确调用了。