C++ 11 nullptr关键字

熟悉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

转载自: http://www.cnblogs.com/DswCnblog/p/5629073.html

在c++11中讨论nullptr和NULL相关推荐

  1. C++11 中的内联函数、auto关键字、for循环及空指针

    C++ 3 内联函数 概念 特性 auto关键字 定义 使用 auto与指针结合起来使用 在同一行定义多个变量 auto不能推导的场景 auto不能作为函数的参数 auto不能直接用来声明数组 基于范 ...

  2. c++引用另一个类的方法_利用CVE20191132:Windows内核中的另一个NULL指针取消引用...

    NULL指针取消引用应该早在几年前就已终止,但仍在恶意软件攻击中被发现和使用.这篇文章探讨了CVE-2019-1132的内部细节,Buhtrap小组将其用于针对东欧的受害者. 介绍 我们在本文中讨论的 ...

  3. C++11中nullptr的使用

    在C语言中,NULL实际上是一个void* 的指针,然后把void* 指针赋值给其它类型的指针的时候,会隐式转换成相应的类型.而如果用一个C++编译器来编译的时候是要出错的,因为C++是强类型的,vo ...

  4. C# 11 中的参数 null 检查

    C# 11 中的参数 null 检查 Intro C# 11 将引入一个新的操作符 !! 来简化我们代码中的对于参数的 null 检查,昨天发布的 .NET 7 Preview 1 已经支持了这一语法 ...

  5. C++11 中值得关注的几大变化

    2019独角兽企业重金招聘Python工程师标准>>> 源文章来自前C++标准委员会的 Danny Kalev 的 The Biggest Changes in C++11 (and ...

  6. c++ 智能指针_详解 C++ 11 中的智能指针

    C/C++ 语言最为人所诟病的特性之一就是存在内存泄露问题,因此后来的大多数语言都提供了内置内存分配与释放功能,有的甚至干脆对语言的使用者屏蔽了内存指针这一概念.这里不置贬褒,手动分配内存与手动释放内 ...

  7. C++11中std::addressof的使用

    C++11中的std::addressof获得一个对象的实际地址,即使 operator& 操作符已被重载.它常用于原本要使用 operator& 的地方,它接受一个参数,该参数为要获 ...

  8. C++/C++11中std::string用法汇总

    C++/C++11中std::string是个模板类,它是一个标准库.使用string类型必须首先包含<string>头文件.作为标准库的一部分,string定义在命名空间std中. st ...

  9. C++11中unique_ptr的使用

    在C++中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化:delete,接受一个动态对象的指针,销毁该对象,并释放与之 ...

最新文章

  1. 网络安全:等保2.0落地在即,触发五百亿新增市场
  2. 每天5分钟玩转python3算法:选择排序
  3. 音乐游戏 简单模拟,字符串,cin.get,getchar,流同步(女赛)
  4. k8s灰度更新_通过rancher部署k8s过程实战分享
  5. studio 快捷键
  6. 金蝶kis云触发器解决审核和反审核的问题
  7. pyqt5 不报错退出_最新版本Python图形化开发环境Anaconda(Python3.7) +PyQT5+Eric6
  8. [论文阅读] Deep Automatic Natural Image Matting
  9. CentOS7(64)环境使用rpm命令安装gcc
  10. Django之admin
  11. Eclipse的环境配置
  12. C# IFELanguage接口获取拼音,支持多音字,音调 win10/8.1/7测试通过
  13. 《动手学深度学习》(PyTorch版)代码注释 - 12 【House_price_prediction】
  14. 【React】React三大属性:Props、State、Refs
  15. python比对excel表数据中的差异_Excel表格中数据比对和查找的几种技巧
  16. 移动魔百盒CM201-2,CH代工(nand,emmc)免拆-刷机固件
  17. CCS7.3安装,关闭win10家庭版自带杀毒
  18. Scala可变长度参数和:_*使用
  19. 如何通过互联网赚钱?
  20. 微信接入探秘(五)——万事俱备,只欠架构(API篇)

热门文章

  1. PostgreSQL与2020 PGConf.asia数据库大会值得关注!
  2. 读《Java夜未眠程序员的心声》感
  3. Android菜鸡的苦逼求职路
  4. HTTP报500错误的原因
  5. IDEA java类文件左下角出现红色的J标识,解决方法
  6. exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException
  7. matlab噪声滤波分析,应用Matlab对含噪声语音信号进行频谱分析及滤波
  8. 一句话木马:初识木马练习
  9. Reinforcement Learning for Non-Stationary Markov Decision Processes: The Blessing of (More) Optimism
  10. Urban Airship Server API - Java客户端实例