文章目录
- NULL
- nullptr
- 总结
- Ref.
NULL
在C++中,NULL实际上是0.因为C++中不能把void*类型的指针隐式转换成其他类型的指针(cpp是强类型语言),所以为了解决空指针的表示问题,C++引入了0来表示空指针,这样就有了上述代码中的NULL宏定义。
在C++中,NULL不过也是0罢了,把它当成空指针只是一个无可奈何的选择罢了。
C++中,任何指针类型可以隐式转换转换为void *
,反过来则必须强制转换。为了支持函数重载,这种隐式转换就不能是双向的,严格来讲,单向也不应该允许。
但是 C++ 还是尽可能兼容 C 语言,允许其他类型隐式转换为void *类型。
nullptr
nullptr并非整型类别,甚至也不是指针类型,但是能转换成任意指针类型。nullptr的实际类型是std:nullptr_t。
二义性实例:
#include<iostream>
using namespace std;
void test(void *p)
{
cout<<"p is pointer "<<p<<endl;
}
void test(int num)
{
cout<<"num is int "<<num<<endl;
}
int main(void)
{
test(NULL);
return 0;
}
因为NULL就是0,所以编译报错,提示有二义性。
但如果使用test(nullptr)
就不会报错
总结
一句话版:为了解决NULL表示空指针在C++中具有二义性,引入nullptr。
C语言中void*
可以和任意指针类型之间隐式转换,但是C++是强类型语言,任何指针类型可以隐式转换成void*
,但是反过来不行,所以把NULL定义成0,表示空指针。但是这又会导致重载的二义性,所以引入了nullptr来表示空指针。
为了支持重载,不允许void *
隐式转换为其他指针类型,因而必须将NULL定义为0。
为了支持重载,NULL和0必须区分开来,因此引入了nullptr。
C++11中才引入nullptr
Ref.
- https://blog.csdn.net/qq_18108083/article/details/84346655
- https://zhuanlan.zhihu.com/p/79883965
- https://www.zhihu.com/question/55936870