zoukankan      html  css  js  c++  java
  • 【C++11新特性】 nullptr关键字

    C/C++中的NULL到底是什么

    我们查看一下C和C++的源码,不难发现:

      1. NULL在C++中的定义
        NULL在C++中被明确定义为整数0:
    /* Define NULL pointer value */
    #ifndef NULL
        #ifdef __cplusplus
            #define NULL    0
        #else  /* __cplusplus */
            #define NULL    ((void *)0)
        #endif  /* __cplusplus */
    #endif  /* NULL */
     
      1. NULL在C中的定义
        在C中,NULL通常被定义为如下:
    #define NULL    ((void *)0)

    也就是说NULL实质上是一个void *指针。

    那么问题又来了,我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?通过查找维基百科,才发现这其中的原因。

    简单地说,C++之所以做出这样的选择,根本原因和C++的函数重载机制有关。考虑下面这段代码:
     

    void Func(char *);
    void Func(int);
    
    int main()
    {
        Func(NULL);
    }

    如果C++让NULL也支持void *的隐式类型转换,这样编译器就不知道应该调用哪一个函数

    为什么要引入nullptr

    C++把NULL定义为0,解决了函数重载后的函数匹配问题,但是又引入了另一个“问题”,同样是上面这段代码:

    void Func(char *);
    void Func(int);
    
    int main()
    {
        Func(NULL);  // 调用Func(int)
    }

    由于我们经常使用NULL表示空指针,所以从程序员的角度来看,Func(NULL)应该调用的是Func(char *)但实际上NULL的值是0,所以调用了Func(int)。nullptr关键字真是为了解决这个问题而引入的。

    另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字。

    nullptr如何使用
    nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。 

    char *p1 = nullptr;     // 正确
    int  *p2 = nullptr;     // 正确
    bool b = nullptr;       // 正确. if(b)判断为false
    int a = nullptr;        // error
  • 相关阅读:
    java正则表达式语法详解及其使用代码实例 (转)
    【SpringMVC学习09】SpringMVC与前台的json数据交互 (转)
    SpringMVC基于代码的配置方式(零配置,无web.xml)
    倒车入库操作要求
    R通过RJDBC连接外部数据库 (转)
    卡尔曼滤波——11.预测峰值
    卡尔曼滤波——10.均值漂移
    卡尔曼滤波——6.评估高斯分布
    神经网络入门——16实现一个反向传播
    神经网络入门——15反向传播
  • 原文地址:https://www.cnblogs.com/dream397/p/14597744.html
Copyright © 2011-2022 走看看