null 和 nullptr

引入nullptr的原因

引入nullptr的原因,这个要从NULL说起。

C和C++中的NULL不等价。NULL表示指针不指向任何对象,但是问题在于,NULL不是关键字,而只是一个宏定义(macro)。

NULL在C中的定义
在C中,习惯将NULL定义为void*指针值0:

#define NULL (void*)0  

C++中,NULL却被明确定义为整常数0:

// lmcons.h中定义NULL的源码  
#ifndef NULL  
#ifdef __cplusplus  
#define NULL    0  
#else  
#define NULL    ((void *)0)  
#endif  
#endif

为什么C++在NULL上选择不完全兼容C?

根本原因和C++的重载函数有关。C++通过搜索匹配参数的机制,试图找到最佳匹配(best-match)的函数,而如果继续支持void*的隐式类型转换,则会带来语义二义性(syntax ambiguous)的问题。

// 考虑下面两个重载函数  
void foo(int i);  
void foo(char* p)  

foo(NULL); // which is called? 

如果我们的编译器是支持nullptr的话,那么我们应该直接使用nullptr来替代NULL的宏定义。正常使用过程中他们是完全等价的。

void foo(int)   {cout << "int" << endl;}  
void foo(char*) {cout << "pointer" << endl;}  

foo(0);       // calls foo(int)  
foo(nullptr); // calls foo(char*)  

0(NULL)和nullptr可以交换使用,如下示例:

int* p1 = 0;  
int* p2 = nullptr;  

if(p1 == 0) {}  
if(p2 == 0) {}  
if(p1 == nullptr) {}  
if(p2 == nullptr) {}  
if(p1 == p2) {}  
if(p2) {}  

参考资料
【1】http://blog.csdn.net/huang_xw/article/details/8764346

你可能感兴趣的:(C/C++基础点)