zoukankan      html  css  js  c++  java
  • 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是带有类型,并且一定是指针。对于上面的函数决策上有着符合直觉的调用。

  • 相关阅读:
    如何探测浏览器是否开启js功能
    CSS3的animation功能
    registerServiceWorker创建的React项目中的registerServiceWorker作用?
    atom的react自动补全插件
    利用SQL Profiler处理开销较大的查询
    详解执行计划
    SQL Server执行计划的理解
    普通<= >=和between的sql查询方式区别与推荐
    学习如何看懂SQL Server执行计划(三)——连接查询篇
    学习如何看懂SQL Server执行计划——基本知识篇
  • 原文地址:https://www.cnblogs.com/cauchy007/p/4966727.html
Copyright © 2011-2022 走看看