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

  • 相关阅读:
    网络基础
    Web开发几种常用工具
    win组合键概述(windows10)
    Alfred使用
    Java8之新特性--modules
    jsp九大内置对象和四大作用域
    authtype
    Myeclipse中的快捷键
    如何在Jenkins CI 里调试
    写好unit test的建议和例子
  • 原文地址:https://www.cnblogs.com/cauchy007/p/4966727.html
Copyright © 2011-2022 走看看