一、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. LeetCode Maximum Length of Pair Chain

    原题链接在这里:https://leetcode.com/problems/maximum-length-of-pair-chain/description/ 题目: You are given n  ...

  2. TexStudio 非常好用的Latex软件

    先大概写一下,免得忘了,等有时间详细补充. 跨平台.免费. 语法高亮 方便的公式.符号选择界面 可以配置Latex,pdflatex,xelatex等默认编译命令 集成了pdf阅读器,可在阅读器中浏览 ...

  3. ExtJs中获得当前选中行号(Grid中多选或者是单选)及Grid的反选(取消选中行)

    多选,如何获得每行的行号: function getlineNum(){    var sm=titleGird.getSelectionModel(); // 获得grid的SelectionMod ...

  4. CentOS6.5下安装mongodb

    MongoDB是目前最常用的NoSQL-非关系型数据库. 本文将介绍在CentOS下如何通过yum安装MongoDB. 1.首先在CentOS6.5下,编辑Mongo的yum源: 在/etc/yum. ...

  5. laravel 常用知识总结

    看到一篇别人的文章感觉写的不错 就copy过来了 学习源头: https://www.cnblogs.com/yjf512/p/3830750.html aravel是个很强大的PHP框架,它剔除了开 ...

  6. JPA,EclipseLink 缓存机制学习——树节点搜索问题引发的思考

    最近在项目在使用JPA+EclipseLink 的方式进行开发,其中EclipseLink使用版本为2.5.1.遇到一些缓存方面使用不当造成的问题,从本篇开始逐步学习EclipseLink的缓存机制. ...

  7. spring学习七

    一: web.xml中常用配置元素? <servlet></servlet>: 在向servlet或JSP页面制定初始化参数或定制URL时,首先命名servlet或JSP页面. ...

  8. 【OpenCV】图像代数运算:平均值去噪,减去背景

    代数运算,就是对两幅图像的点之间进行加.减.乘.除的运算.四种运算相应的公式为: 代数运算中比较常用的是图像相加和相减.图像相加常用来求平均值去除addtive噪声或者实现二次曝光(double-ex ...

  9. docker 端口映射iptables: No chain/target/match by that name错误解决方法

    pkill docker iptables -t nat -F ifconfig docker0 down brctl delbr docker0 service docker restart

  10. pyodbc连接MySQL数据库

    1:Python安装pyodbc:pip install pyodbc 2:安装unixODBC-2.3.4.tar.gz ./configure make make install 3:下载基于py ...