熟悉C++的童鞋都知道,为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量,则需要赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:

如下:

int *p1 = NULL; // 需要引入cstdlib头文件
int *p2 = ;
int *p3 = nullptr;

新标准中建议使用nullptr代替NULL来声明空指针。到这里,大家心里有没有疑问:为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?这就是我们今天要解决的问题。

C/C++中的NULL到底是什么

我们查看一下C和C++的源码,不难发现:

1.NULL在C++中的定义,NULL在C++中被明确定义为整数0:

/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */

2.NULL在C中的定义.在C中,NULL通常被定义为如下:

#define NULL    ((void *)0)

也就是说NULL实质上是一个void *指针。

那么问题又来了,我们从一开始学习C++的时候就被告诫C++是兼容C的,为什么对于NULLC++却不完全兼容C呢?通过查找维基百科,才发现这其中的原因。

简单地说,C++之所以做出这样的选择,根本原因和C++的函数重载机制有关。考虑下面这段代码:

void Func(char *);
void Func(int); int main()
{
Func(NULL);
}

如果C++让NULL也支持void *的隐式类型转换,这样编译器就不知道应该调用哪一个函数。

为什么要引入nullptr

C++把NULL定义为0,解决了函数重载后的函数匹配问题,但是又引入了另一个“问题”,同样是上面这段代码:

void Func(char *);
void Func(int); int main()
{
Func(NULL); // 调用Func(int)
}

由于我们经常使用NULL表示空指针,所以从程序员的角度来看,Func(NULL)应该调用的是Func(char *)但实际上NULL的值是0,所以调用了Func(int)。nullptr关键字真是为了解决这个问题而引入的。

另外我们还有注意到NULL只是一个宏定义,而nullptr是一个C++关键字。

nullptr如何使用

nullptr关键字用于标识空指针,是std::nullptr_t类型的(constexpr)变量。它可以转换成任何指针类型和bool布尔类型(主要是为了兼容普通指针可以作为条件判断语句的写法),但是不能被转换为整数。

char *p1 = nullptr;     // 正确
int *p2 = nullptr; // 正确
bool b = nullptr; // 正确. if(b)判断为false
int a = nullptr; // error

最新文章

  1. 去除多余的cell 和最后一行cell显示顶头底线
  2. flex进行页面的基础布局
  3. NOIP提高组2004 合并果子题解
  4. spring boot servlet、filter、listener
  5. (十一) 一起学 Unix 环境高级编程 (APUE) 之 高级 IO
  6. 好久没弄了,来个最简的centos下的Iptables文件存照吧。
  7. [转]Struts标签库详解
  8. 安装SqlServer2008时相关问题
  9. Twenty Newsgroups Classification任务之二seq2sparse(3)
  10. 谈谈分布式事务之一:SOA需要怎样的事务控制方式
  11. 基于Android的物理类游戏,源代码(JAVA)分享
  12. C++之------虚函数
  13. WPF 设置WebBrowser控件不弹脚本错误提示框
  14. 使用Android Studio导入第三方库项目
  15. docker学习------centos7.5下的swarm集群可视化构建
  16. APPLE-SA-2019-3-25-5 iTunes 12.9.4 for Windows
  17. min_25筛题目总结
  18. Angularjs 动态创建属性
  19. Python操作MySQL-day11
  20. poj3924

热门文章

  1. Yahoo团队总结的关于网站性能优化的经验(转)
  2. Electron 入门案例1
  3. svn log笔记
  4. VB LISTBOX属性
  5. 1、redis之安装与配置
  6. js 面向对象式编程
  7. CEF 各个版本适应的平台参考表
  8. Dell笔记本Ubuntu无线网卡驱动安装
  9. HDUOJ----The Number Off of FFF
  10. 教你动手做一个 iOS 越狱 app