【C++】NULL和nullptr的区别

C语言中NULL是指空指针,一般定义为函数

#define NULL ((void *)0)

能够把空指针赋给其余类型的指针,由于在编译的时候能够隐式类型转换。指针

可是C++的编译器不容许将void*类型的指针隐式转换为其余类型的指针。code

因此C++中是这样定义NULL的blog

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

因此C++中的NULL其实是0。编译器

可是若是咱们在C++中仍是把NULL当成void*来用可能会出问题。io

好比下面的函数重载的状况编译

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)。function

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