前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++11之nullptr

C++11之nullptr

作者头像
zy010101
发布2019-05-25 20:02:33
6010
发布2019-05-25 20:02:33
举报
文章被收录于专栏:程序员程序员

我们都知道,在写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操作。我们看一个例子:

代码语言:javascript
复制
#include <iostream>

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

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

int main(int argc, char** argv)
{
	f(12);
	f(NULL);
	f((int*) 0);
}

输出如下:

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

代码语言:javascript
复制
#include <iostream>

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

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

int main(int argc, char** argv)
{
	f(nullptr);
}

这段代码输出如下:

我们可以看到,它按照我们原本的意思,成功的调用了指针类型的重载函数。

但是需要注意的是nullptr的地址是不能被用户使用的。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年06月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档