C++ 新特性 | C++ 11 | nullptr 关键字

一、NULL 和 nullptr 的区别

1.1、C++ 11 引入 nullptr 的背景

NULL是一个宏,被定义为空指针,可以在stddef.h看到完整定义,如下:

#undef NULL
#if defined(__cplusplus)
#define NULL 0
#else
#define NULL ((void *)0)
#endif

C++11 引入了 nullptr 关键字,都用来表示空指针。为什么 C++11 要引入 nullptr 呢?先分析下使用NULL存在的问题,示例:

#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;
}

编译结果:

main.cpp: In function ‘int main():
main.cpp:16:14: error: call of overloaded ‘test(NULL)’ is ambiguous
     test(NULL);

上面的代码在编译时会存在问题,提示有二义性。上面的 C++ 程序:程序中重载了函数 test,可根据参数不同分别进行调用。但是存在一个问题,C语言是有隐式类型转换的,所以 NULL(这里实际上是 (void *)0 ) 可以隐式转换到 int 或 char * 。这就让程序很为难了,程序不知道选择调用哪个函数。而在 C 语言中,并不支持函数重载,故在纯 C 语言中不会有上面这个问题。

1.2、nullptr

在 stddef.h 中,nullptr 的定义如下:

#if defined(__cplusplus) && __cplusplus >= 201103L
#ifndef _GXX_NULLPTR_T
#define _GXX_NULLPTR_T
  typedef decltype(nullptr) nullptr_t;
#endif
#endif /* C++11.  */

C++11标准中,nullptr是一个所谓“指针空值类型”的常量,指针空值类型被命名为nullptr_t。可以看到,nullptr_t的定义方式非常有趣,与传统的先定义类型,再通过类型定义变量的做法完全相反(充分利用了decltype的功能)。

什么场景使用nullptr?

使用C++进行编程时,如果想表示空指针,那么使用nullptr,而不是NULL。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值