天天看点

【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;
}
           
【C++】NULL和nullptr的区别

本来想用NULL代表空指针调用myFunc(void* p)函数,实际却调用了myFunc(int p)。

因此,C++11中引入了nullptr这个关键字来表示空指针。上面的nullptr作为实参确实也正确调用了。

继续阅读