在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题。
在C程序中,NULL是在头文件cstdlib中定义的预处理变量,它的值就是0。
NULL在C中: #define NULL ((void *)0)
而C++是强类型语言,void*是不能隐式转换成其他类型的指针的。
NULL在C++中:
#ifdef __cplusplus #define NULL 0 #else #define NULL ((void *)0) #endif
是故,如果在c++中执行如下程序,
void func(void* i) { cout << "func1" << endl; } void func(int i) { cout << "func2" << endl; } void main(int argc,char* argv[]) { func(NULL); func(nullptr); getchar(); }
结果为:
func2
func1
在代码中对函数func进行可重载,参数分别是void*类型和int类型,运行结果却与我们所期望的结果是不相符的。用NULL来代替空指针,但是在将NULL输入到函数中时,它却选择了int形参这个函数版本,这就是用NULL代替空指针在C++程序中的二义性。