C++ 11 nullptr关键字
C++ 11 nullptr关键字
转载:https://www.cnblogs.com/DswCnblog/p/5629073.html
熟悉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++的源码,不难发现:
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
C++ 11 nullptr关键字相关推荐
- 【C++11新特性】 nullptr关键字
原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50478512 熟悉C++的童鞋都知道,为了避免"野指针"(即 ...
- 【C++】C++11新增关键字详解
目录 一.auto 1.auto 用来声明自动变量,表明变量存储在栈(C++11之前) 2.auto用于推断变量类型示例(C++11) 3.声明或定义函数时作为函数返回值的占位符,此时需要与关键字 d ...
- 【C++登山之路之初露锋芒 2】——内联函数+ 引用+auto+nullptr关键字(万字详解,图片演示,结构原理)
目录 1.内联函数 2.引用 2.1引用涉及的隐式类型转换和权限问题 2.2引用和指针 3.auto关键字 4.nullptr关键字 内联函数 以inline修饰的函数叫做内联函数,编译时C++编译器 ...
- c++ 11 nullptr
c++指针的使用,在所有教材中都提倡声明的时候要初始化,防止"野指针",如果不明确该指针指向变量,则直接赋予NULL值.除了NULL之外,C++11新标准中又引入了nullptr来 ...
- C++11 新关键字
文章目录 1.auto 1.1 用法示例 2.using 3.decltype 3.1 decltype 推导规则 3.2 用法示例 4.nullptr_t 与 nullptr 5.constexpr ...
- C++中的糖果——缺省参数、内联函数、auto及nullptr关键字
在C++中,相对于C语言,我们引入了许多新的概念,新的机制,它们的到来让我们的编程方便了不少,它并没有多么难理解,但是比较零碎,在我看来它就是一些加分项,故此,我们通常也将其称为C++中的糖果.下面就 ...
- C++11 nullptr与常量表达式constexpr记录
1.nullptr (1) nullptr是一个关键字,而nullptr_t是一个类型 typedef decltype(nullptr) nullptr_t 使用nullptr_t类型必须包含#in ...
- C++11 新增关键字decltype学习
decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"declare type"的缩写,译为&q ...
- C++11 auto 关键字学习1
在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的.auto 表示变量是自动存储的. C++11 中,使用它来做自动类型推导.也就是说,使用了 aut ...
最新文章
- 商淘多b2b2c商城系统怎么在个人电脑上安装_社交电商系统开发是否有价值?
- 《强化学习周刊》第34期:牛津、谷歌、Facebook等 | 自动强化学习 (AutoRL):研究综述和开放性问题...
- 出现adb连接不上的解决办法(转载)
- mysql中取出的时间日期多个.0
- 《研磨设计模式》chap7 抽象工厂 Abstract Factory
- 第二阶段团队项目冲刺第三天
- ecshop 广告设置
- Spark执行任务卡死:SparkException: Failed to connect to driver! unable to launch application master
- 第二百六十三天 how can I 坚持
- 好东西!适合电商促销C4D场景模型海报素材!
- 浏览器本地存储(cookie、sessionStorage和localStorage)
- %3c大自然的语言%3e竺可桢题目,大自然的语言竺可桢阅读答案
- sev2008服务器系统,在windows 2008 64位系统安装sql server 2000
- 基于LSTM的IMDB电影评论情感分析
- Java设计模式--------观察者模式
- 二维几何图形创作方法(Geometry2D)
- 中国的美女为什么这样少的原因
- windows 认证机制
- 数学建模——BP神经网络学习笔记
- Linux 进程编程入门