C++ NULL & nullptr 谁才是虚无
“虚无在某方面可以理解为零,也可以理解为无限,因为虚无包容一切,却又不同于任何事物.”
在C语言中,我们常用NULL来初始化指针,从而避免野指针出现
但在C++中,却不建议这么做
不是放任野指针泛滥,而是有了更优的解决方案
在C头文件中,我们可以看到NULL的定义:
#define NULL ((void *)0)//地址为0的void*指针
在C++头文件中,可以发现NULL的不同定义:
#ifndef NULL
#ifdef __cplusplus //C++
#define NULL 0
#else
#define NULL ((void *)0)
#endif//兼容C/C++
#endif
也就是说,在C++中,NULL就是整型字面量0而已
C与C++为什么存在NULL的定义差异?
因为C++相对来说更加注重安全性,不允许void*隐式转换为其它指针类型
所以无可奈何花落去,只能用0凑数
整型NULL与指针类型存在不可逾越的类型鸿沟,从而埋下了隐患
例如,函数重载匹配问题:
void func(void* p);
void func(long n);
func(NULL);
此时编译报错,存在二义性匹配问题,NULL 默认int ,两个函数都需要类型转换,均无法精确匹配。
而在C语言老玩家眼中,NULL代表指针类型,造成表象与实质不符,令人迷惑且费解
同样,在模板元编程中,NULL无法被推导为指针类型,可能与预期不符
nullptr
为了解决这个问题,C++11标准引入了nullptr
nullptr本质是个类类型变量(std::nullptr_t)
它并非指针类型,但可以转化为任何指针类型以及bool型(兼容条件判断)
类型转换过程通过类内的类型转换运算符实现
由于只能转换为指针类型和bool,所以不会和整型混淆,也算正名了
综上,可以不必想太多,用nullptr代替NULL作为空指针即可
int *p = nullptr; //虚无源于混沌,混沌终归于虚无。