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

原文地址:https://www.cnblogs.com/cauchy007/p/4966727.html