C++ NULL & nullptr 谁才是虚无

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; //虚无源于混沌,混沌终归于虚无。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值