C++ nullptr 与 NULL 的区别

在C++标准中有一条特殊的规则,即NULL既是一个整型常量,又是一个空指针常量。NULL作为空指针常量还能隐式地转换为各种指针类型。

比如我们在初始化变量的时候经常看到的代码:

char *p = NULL;
int x = 0;

这里的NULL是一个宏,在C++11标准之前其本质就是0:

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

这在C++的隐式转换中 NULL 可能更先被推导为 int。

C++11中添加关键字nullptr表示空指针的字面量,它是一个std::nullptr_t类型的纯右值。nullptr的用途非常单纯,就是用来指示空指针,它不允许运用在算术表达式中或者与非指针类型进行比较(除了空指针常量0)。它还可以隐式转换为各种指针类型,但是无法隐式转换到非指针类型。而 0 依然保留着可以代表整数和空指针常量的特殊能力,保留这一点是为了让C++11标准兼容以前的C++代码。

nullptr的出现消除了使用NULL带来的二义性,与此同时其类型和含义也更加明确。

含义明确的好处是,C++标准可以加入一系列明确的规则去限制nullptr的使用,这让程序员能更快地发现编程时的错误。

所以建议读者在编译器支持的情况下,总是优先使用nullptr而非NULL。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值