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关键字相关推荐

  1. 【C++11新特性】 nullptr关键字

    原创作品,转载请标明:http://blog.csdn.net/Xiejingfa/article/details/50478512 熟悉C++的童鞋都知道,为了避免"野指针"(即 ...

  2. 【C++】C++11新增关键字详解

    目录 一.auto 1.auto 用来声明自动变量,表明变量存储在栈(C++11之前) 2.auto用于推断变量类型示例(C++11) 3.声明或定义函数时作为函数返回值的占位符,此时需要与关键字 d ...

  3. 【C++登山之路之初露锋芒 2】——内联函数+ 引用+auto+nullptr关键字(万字详解,图片演示,结构原理)

    目录 1.内联函数 2.引用 2.1引用涉及的隐式类型转换和权限问题 2.2引用和指针 3.auto关键字 4.nullptr关键字 内联函数 以inline修饰的函数叫做内联函数,编译时C++编译器 ...

  4. c++ 11 nullptr

    c++指针的使用,在所有教材中都提倡声明的时候要初始化,防止"野指针",如果不明确该指针指向变量,则直接赋予NULL值.除了NULL之外,C++11新标准中又引入了nullptr来 ...

  5. C++11 新关键字

    文章目录 1.auto 1.1 用法示例 2.using 3.decltype 3.1 decltype 推导规则 3.2 用法示例 4.nullptr_t 与 nullptr 5.constexpr ...

  6. C++中的糖果——缺省参数、内联函数、auto及nullptr关键字

    在C++中,相对于C语言,我们引入了许多新的概念,新的机制,它们的到来让我们的编程方便了不少,它并没有多么难理解,但是比较零碎,在我看来它就是一些加分项,故此,我们通常也将其称为C++中的糖果.下面就 ...

  7. C++11 nullptr与常量表达式constexpr记录

    1.nullptr (1) nullptr是一个关键字,而nullptr_t是一个类型 typedef decltype(nullptr) nullptr_t 使用nullptr_t类型必须包含#in ...

  8. C++11 新增关键字decltype学习

    decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导. decltype 是"declare type"的缩写,译为&q ...

  9. C++11 auto 关键字学习1

    在之前的 C++ 版本中,auto 关键字用来指明变量的存储类型,它和 static 关键字是相对的.auto 表示变量是自动存储的. C++11 中,使用它来做自动类型推导.也就是说,使用了 aut ...

最新文章

  1. 商淘多b2b2c商城系统怎么在个人电脑上安装_社交电商系统开发是否有价值?
  2. 《强化学习周刊》第34期:牛津、谷歌、Facebook等 | 自动强化学习 (AutoRL):研究综述和开放性问题...
  3. 出现adb连接不上的解决办法(转载)
  4. mysql中取出的时间日期多个.0
  5. 《研磨设计模式》chap7 抽象工厂 Abstract Factory
  6. 第二阶段团队项目冲刺第三天
  7. ecshop 广告设置
  8. Spark执行任务卡死:SparkException: Failed to connect to driver! unable to launch application master
  9. 第二百六十三天 how can I 坚持
  10. 好东西!适合电商促销C4D场景模型海报素材!
  11. 浏览器本地存储(cookie、sessionStorage和localStorage)
  12. %3c大自然的语言%3e竺可桢题目,大自然的语言竺可桢阅读答案
  13. sev2008服务器系统,在windows 2008 64位系统安装sql server 2000
  14. 基于LSTM的IMDB电影评论情感分析
  15. Java设计模式--------观察者模式
  16. 二维几何图形创作方法(Geometry2D)
  17. 中国的美女为什么这样少的原因
  18. windows 认证机制
  19. 数学建模——BP神经网络学习笔记
  20. Linux 进程编程入门

热门文章

  1. CentOS四种方法自建yum仓库
  2. 为企业提供本地销售人员的Universal Avenue获1000万美元A轮融资
  3. 远程管理服务器的具体操作方法
  4. polymer web componets 大前端
  5. HP服务器F10 Function Disabled,无法使用F10安装操作系统
  6. 在过渡到Agile中的十种错误
  7. 体验了一下用word 2007发表博客
  8. 利用Excel VBA畫出所有圖標
  9. Redis1 晨考题
  10. 事务以及@Transcational注解