标签:
一、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 = 0; char *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是带有类型,并且一定是指针。对于上面的函数决策上有着符合直觉的调用。
标签:
原文地址:http://www.cnblogs.com/cauchy007/p/4966727.html