C++11之nullptr


我们都知道,在写C/C++程序时,一个合格的程序员,总是在书写指针的时候会初始化指针为NULL。这样就避
免了野指针(悬挂指针)的出现。如果使用了未初始化的指针,那么可能会导致一些难以调试的错误。
在传统的C语言头文件stddef.h之中,我们可以看到如下代码:
 #ifndef NULL
  #ifdef __cplusplus
  #define NULL 0
  #else
  #define NULL ((void *)0)
  #endif
可以看到如果是c语言就是NULL就是(void *)0,在C++里就是0。这个时候可能会引发一些问题。大多数的计算机系统并不允许我们对0这个地址进行write和read操作。我们看一个例子:
#include <iostream>

using std::cout;
void f(int* p)
{
	cout << "int* f
";
}

void f(int a)
{
	cout << "int f
";
}

int main(int argc, char** argv)
{
	f(12);
	f(NULL);
	f((int*) 0);
}
输出如下:

我们看到,NULL作为参数的时候,实际并没有调用指针为形式参数的函数,而是调用了形式参数为int的函数。当我们使用强制转换的时候,没有什么问题。因此,这样的调用可能是违背我们的原意的。所以C++11引入了新的指针空值nullptr。很好的解决了上面出现的违背原意的操作。C++11把nullptr作为一个关键字引入。它本身是“指针空值类型”的一个常量。指针空值常量类型被命名为nullptr_t。我们来看下面的代码:
#include <iostream>

using std::cout;
void f(int* p)
{
	cout << "int* f
";
}

void f(int a)
{
	cout << "int f
";
}

int main(int argc, char** argv)
{
	f(nullptr);
}
这段代码输出如下:


我们可以看到,它按照我们原本的意思,成功的调用了指针类型的重载函数。
但是需要注意的是nullptr的地址是不能被用户使用的。

原文地址:https://www.cnblogs.com/zy666/p/10504354.html