一、nullptr的意义

  1.NULL在C中的定义

#define NULL (void*)0

  2.NULL在C++中的定义

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

  3.为什么C++和C中NULL定义不一样呢?

void foo(int a)
{
cout<<"This is int"<<endl;
}
void foo(char * ptra)
{
cout<<"This is pointer"<<endl;
}
int main(void)
{
foo(NULL);
return ;
}

  有两个函数定义如上,如果沿用C中NULL定义为((void*)0),那么foo(NULL)将编译不过,因为C++不能讲((void*)0)隐式转换为((char*)0),也不能隐式转换为(int 0),找不到匹配函数。如果使用C++中将NULL定义为0,那么foo(NULL)将匹配void foo(int a),这也和我们的期望不一致(我们认为NULL是一个空指针,那么应该调用void foo(char * ptra)才对)。为了解决这个问题,C++11新标准引入了nullptr。

二、nullptr用法

  nullptr在任何时候都是一个空指针,所以对指针时优先使用。大部分情况下NULL和nullptr可以交换使用,但是我不建议这样混用

    int tempA = ;
char *ptrTempA = NULL;
char *ptrTempB = nullptr; /*1.调用foo(int)*/
foo(NULL);
/*2.调用foo(char*)*/
foo(ptrTempA);
foo(nullptr);
foo(ptrTempB);
/*3.此处的0是一个指针,可以进行比较,编译通过*/
if( == nullptr){}
/*4.不能将整型和一个指针进行比较,编译不过*/
if(tempA == nullptr){}
/*5.可以进行比较,但是会有告警,NULL可以理解成双重指针,既可以是空指针,又可以是整型0*/
if(tempA == NULL){}

三、nullptr使用总结

  在编译器支持的情况下,优先使用nullptr,nulltpr是带有类型,并且一定是指针。对于上面的函数决策上有着符合直觉的调用。

C++11新标准:nullptr关键字的更多相关文章

  1. C++11新标准:decltype关键字

    一.decltype意义 有时我们希望从表达式的类型推断出要定义的变量类型,但是不想用该表达式的值初始化变量(如果要初始化就用auto了).为了满足这一需求,C++11新标准引入了decltype类型 ...

  2. C++11新标准:auto关键字

    一.auto意义 编程时常常需要把表达式的值赋给变量,这就要求在声明变量的时候清楚地知道表达式的类型,然后要做到这一点并非那么容易.为了解决这个问题,C++11新标准引入了auto类型说明符,用它就能 ...

  3. C++11新标准学习

    <深入理解C++11:C++11新特性解析与应用> <华章科技:深入理解C++11:C++11新特性解析与应用>一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中 ...

  4. c++11新标准for循环和lambda表达式

    :first-child { margin-top: 0px; } .markdown-preview:not([data-use-github-style]) h1, .markdown-previ ...

  5. 关注C++细节——C++11新标准之decltype的使用注意

    c++11新特性--decltype decltype是C++11加入的一个新的keyword,目的是选择并返回操作数的数据类型,重要的是,在此过程中编译器分析表达式并得到它的类型,却不实际计算表达式 ...

  6. C++11新标准:constexpr关键字

    一.constexpr意义 将变量声明为constexpr类型以便由编译器来验证变量是否是一个常量表达式(不会改变,在编译过程中就能得到计算结果的表达式).是一种比const更强的约束,这样可以得到更 ...

  7. C++11新标准

    1. 新类型 long long和unsigned long long: char16_t 和 char32_t: 新增原始字符串: 2. 统一的初始化 C++11扩大了用大括号括起的列表(初始化列表 ...

  8. 基于c++11新标准开发一个支持多线程高并发的网络库

    背景 新的c++11标准出后,c++语法得到了非常多的扩展,比起以往不论什么时候都要灵活和高效,提高了程序编码的效率,为软件开发者节省了不少的时间. 之前我也写过基于ACE的网络server框架,但A ...

  9. C++ 11新标准实现POJ No.1002-487-3279

    487-3279(重复的电话号码查询)(标签:优先队列,哈希表) 题目描述 企业喜欢用容易被记住的电话号码.让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语.例如,你需要给滑铁卢大学 ...

随机推荐

  1. 《Javascript高级程序设计》阅读记录(四):第五章 下

    这个系列,我会把阅读<Javascript高级程序设计>之后,感觉讲的比较深入,而且实际使用价值较大的内容记录下来,并且注释上我的一些想法.做这个一方面是提升了我的阅读效果以及方便我以后阅 ...

  2. k2 4.6.9安装记录-够复杂了

    首先需要准备一台Windows server 2008R2 系统.可以从微软官方下载. 下载地址: http://www.microsoft.com/zh-cn/download/confirmati ...

  3. Js中获取键盘的事件

    使用方法: <script type="text/javascript" language=JavaScript charset="UTF-8"> ...

  4. Jet Brains家族XX方法

    声明:本文转载自 https://www.jianshu.com/p/f404994e2843 2018/11/23

  5. Angular5学习笔记 - 配置Http(七)

    一.引入Http模块 编辑\src\app\app.module.ts文件 import { HttpModule } from '@angular/http'; /* 注册模块 */ imports ...

  6. Python函数(二)-参数传递

    位置参数 根据位置顺序来传递参数 # -*- coding:utf-8 -*- __author__ = "MuT6 Sch01aR" def test(a,b): #a和b为形参 ...

  7. numpy.percentile

    http://docs.scipy.org/doc/numpy/reference/generated/numpy.percentile.html numpy.percentile(a, q, axi ...

  8. leetcode633

    用开方的思想来解题. bool judgeSquareSum(int c) { int h = pow(c, 0.5); ; i <= h; i++) { ), 0.5); if (left - ...

  9. hadoop再次集群搭建(3)-如何选择相应的hadoop版本

    之前接触过很多很多hadoop版本,现在重新搭建平台,面临选择哪个版本的问题. 当我们决定是否采用某个软件用于开源环境时,通常需要考虑以下几个因素: (1)是否为开源软件,即是否免费. (2) 是否有 ...

  10. java之静态函数和静态变量

    静态变量: 静态变量好似一种成员变量,它的特点是前面有static. 普通变量会有多份,它在每个对象当中都存在,但是静态变量只有一份,它是属于类的. 静态变量的调用方法: 1.类名.变量名 Custo ...