一、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. Docker registry 与 持续集成

    1.如何建立私有的 Docker Hub docker是一个非常好用的虚拟化工具. Registry 在git上分为老代码库和新代码库,老代码push,pull 存在性能问题,新代码库采用go语言编写 ...

  2. UOJ348. 【WC2018】州区划分

    UOJ348. [WC2018]州区划分 http://uoj.ac/problem/348 分析: 设\(g(S)=(\sum\limits_{x\in S}w_x)^p[合法]\) \(f(S)\ ...

  3. django的工作图

  4. position:sticky属性测试

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Erlang pool management -- Emysql pool optimize

    在上一篇关于Emysql pool (http://www.cnblogs.com/--00/p/4281938.html)的分析的最后提到 现在的emysql_conn_mgr gen_server ...

  6. 记录启用HTTPS的全过程

    因为 https 采用 ssl 加密,所以部署 https 时需要申请证书,证书的作用就是对浏览器和Web服务器双方的身份验证. 步骤1:申请证书 我们采用Let's Encrypt签发的免费证书,虽 ...

  7. minidump-DMP文件的生成和使用

    转载地址点击打开链接 1.生成dmp的程序 #include  <dbghelp.h> #pragma comment(lib,  "dbghelp.lib") //设 ...

  8. 重新认识synchronized(上)

    synchronized在JDK5之前一直被称为重量级锁,是一个较为鸡肋的设计,而在JDK6对synchronized内在机制进行了大量显著的优化,加入了CAS,轻量级锁和偏向锁的功能,性能上已经跟R ...

  9. 第三章 Java内存模型(上)

    本章大致分为4部分: Java内存模型的基础:主要介绍内存模型相关的基本概念 Java内存模型中的顺序一致性:主要介绍重排序和顺序一致性内存模型 同步原语:主要介绍3个同步原语(synchroized ...

  10. python metaclass(元类)

    metaclass(元类) 一.创建类的执行流程 二.元类的认识 什么是元类呢?在Python3中继承type的就是元类 二.元类的示例 方式一: # 方式一 class MyType(type): ...