【C++11新特性】 nullptr关键字
来源:互联网 发布:linux下卸载oracle11g 编辑:程序博客网 时间:2024/05/01 13:27
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50478512
熟悉C++的童鞋都知道,为了避免“野指针”(即指针在首次使用之前没有进行初始化)的出现,我们声明一个指针后最好马上对其进行初始化操作。如果暂时不明确该指针指向哪个变量,则需要赋予NULL值。除了NULL之外,C++11新标准中又引入了nullptr来声明一个“空指针”,这样,我们就有下面三种方法来获取一个“空指针”:
如下:
int *p1 = NULL; // 需要引入cstdlib头文件int *p2 = 0;int *p3 = nullptr;
新标准中建议使用nullptr代替NULL来声明空指针。到这里,大家心里有没有疑问:为什么C++11要引入nullptr?它与NULL相比又有什么不同呢?这就是我们今天要解决的问题。
C/C++中的NULL到底是什么
我们查看一下C和C++的源码,不难发现:
- 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 */
- 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)判断为falseint a = nullptr; // error
- 【C++11新特性】 nullptr关键字
- c++11新特性--nullptr
- C++11 新特性之 nullptr
- C++11 新特性之 nullptr
- C++11 新特性之 nullptr
- C++11新特性之 nullptr
- 【C++11】新特性——引入nullptr
- [C++11]新特性——引入了nullptr
- 【C++11】nullptr关键字
- 【C++11】nullptr关键字
- 【C++11】nullptr关键字
- Modern C++(五)nullptr关键字
- C++ 0x 新特性(5):Nullptr
- C++11的关键字nullptr
- nullptr关键字
- C+11 新特性
- C++11中auto 关键字、nullptr关键字和decltype关键字
- c++11 新特性之 auto关键字
- js全局变量问题
- 从零开始使用eclipse Ant脚本语言生成.h头文件:[javah] Exception in thread "main" java.lang.NullPointerException
- 汉字转换成拼音
- 设计模式之观察者模式
- TLD for android 移植问题
- 【C++11新特性】 nullptr关键字
- 将js中的object 中的对象遍历出来
- 日志2016-1-7
- UIView的layoutSubviews和drawRect方法何时调用
- [NOI2004]郁闷的出纳员 (Splay)
- sretcarahCgnitaepeRtuohtiWgnirtsbuStsegnoL.3
- eclipse hashmap 发生InvocationException的解决方案
- chrome上的一些好用的插件
- instancetype和id的区别