• C++11新标准:nullptr关键字


    一、nullptr的意义

      1.NULL在C中的定义

    #define NULL (void*)0

      2.NULL在C++中的定义

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

      3.为什么C++和C中NULL定义不一样呢?

    void foo(int a)
    {
        cout<<"This is int"<<endl;
    }
    void foo(char * ptra)
    {
        cout<<"This is pointer"<<endl;
    }
    int main(void)
    {
        foo(NULL);
        return 0;
    }

      有两个函数定义如上,如果沿用C中NULL定义为((void*)0),那么foo(NULL)将编译不过,因为C++不能讲((void*)0)隐式转换为((char*)0),也不能隐式转换为(int 0),找不到匹配函数。如果使用C++中将NULL定义为0,那么foo(NULL)将匹配void foo(int a),这也和我们的期望不一致(我们认为NULL是一个空指针,那么应该调用void foo(char * ptra)才对)。为了解决这个问题,C++11新标准引入了nullptr。

    二、nullptr用法

      nullptr在任何时候都是一个空指针,所以对指针时优先使用。大部分情况下NULL和nullptr可以交换使用,但是我不建议这样混用

        int tempA = 0char *ptrTempA = NULL;
        char *ptrTempB = nullptr;
        
        /*1.调用foo(int)*/
        foo(NULL);
        /*2.调用foo(char*)*/
        foo(ptrTempA);
        foo(nullptr);
        foo(ptrTempB);
        /*3.此处的0是一个指针,可以进行比较,编译通过*/
        if(0 == nullptr){}
        /*4.不能将整型和一个指针进行比较,编译不过*/
        if(tempA == nullptr){}
        /*5.可以进行比较,但是会有告警,NULL可以理解成双重指针,既可以是空指针,又可以是整型0*/
        if(tempA == NULL){}

    三、nullptr使用总结

      在编译器支持的情况下,优先使用nullptr,nulltpr是带有类型,并且一定是指针。对于上面的函数决策上有着符合直觉的调用。

  • 相关阅读:
    slf4j+log4j的使用
    <context:component-scan>详解
    Spring装配Bean---使用xml配置
    Spring应用上下文中Bean的生命周期
    bootstrap table 复选框选中后,翻页之后保留先前选中数据
    前后端分离的时代,如何解决前后端接口联调问题?
    利用vue-cli搭建vue项目
    vue之注册自定义的全局js函数
    小程序之图片上传
    微信小程序-蓝牙连接
  • 原文地址:https://www.cnblogs.com/cauchy007/p/4966727.html
Copyright © 2020-2023  润新知