C++11中nullptr的使用
在C语言中,NULL实际上是一个void* 的指针,然后把void* 指针赋值给其它类型的指针的时候,会隐式转换成相应的类型。而如果用一个C++编译器来编译的时候是要出错的,因为C++是强类型的,void* 是不能隐式转换成其它指针类型的。在C++中为了解决空指针的问题,在C++中引入0来表示空指针。NULL无类型,它是一个宏。nullptr是有类型的,类型是std::nullptr_t。
推荐:纯C语言用NULL;C++用0;如果编译器支持nullptr,使用nullptr。
The keyword nullptr denotes the pointer literal. It is a prvalue(pure rvalue) of type std::nullptr_t. There exist implicit conversions from nullptr to null pointer value of any pointer type and any pointer to member type. Similar conversions exist for any null pointer constant, which includes values of type std::nullptr_t as well as the macro NULL.
Both true and false are keywords and as literals they have a type ( bool ). nullptr is a pointer literal of type std::nullptr_t, and it's a prvalue (you cannot take the address of it using &).
A null pointer constant with the nullptr value has the following characteristics:
(1)、It can be converted to any pointer or pointer-to-member type.
(2)、It cannot be implicitly converted to any other type, except for the bool type.
(3)、It cannot be used in an arithmetic expression.
(4)、It can be compared with the integer 0.
(5)、It can be used in relational expressions to compare with pointers or data of the std::nullptr_t type.
It should be noted that in C++11 it is still acceptable to assign the value 0 or NULL to a pointer.
在VS2013中,NULL的定义是在stdio.h文件中,如下:
/* Define NULL pointer value */
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else /* __cplusplus */
#define NULL ((void *)0)
#endif /* __cplusplus */
#endif /* NULL */
下面是从其他文章中copy的测试代码,详细内容介绍可以参考对应的reference:
#include "nullptr.hpp"#include <iostream>
#include <cstddef> // for std::nullptr_t///
// reference: http://en.cppreference.com/w/cpp/language/nullptr
template<class F, class A>
void Fwd(F f, A a)
{f(a);
}void g(int* i)
{std::cout << "Function g called\n";
}int test_nullptr1()
{g(NULL); // Fineg(0); // FineFwd(g, nullptr); // Fine// Fwd(g, NULL); // ERROR: No function g(int) // error C2664: “void (int *)”: 无法将参数 1 从“int”转换为“int *”int length1 = sizeof(NULL); // x64, length1 = 4int length2 = sizeof(nullptr); // x64, length2 = 8return 0;
}///
// reference: https://msdn.microsoft.com/zh-cn/library/4ex65770.aspx
class MyClass {
public:int i;
};int test_nullptr2()
{MyClass * pMyClass = nullptr;if (pMyClass == nullptr)std::cout << "pMyClass == nullptr" << std::endl; // pMyClass == nullptrif (pMyClass == 0)std::cout << "pMyClass == 0" << std::endl; // pMyClass == 0pMyClass = 0;if (pMyClass == nullptr)std::cout << "pMyClass == nullptr" << std::endl; // pMyClass == nullptrif (pMyClass == 0)std::cout << "pMyClass == 0" << std::endl; // pMyClass == 0return 0;
}/
void f(int *)
{std::cout << "f(int *)" << std::endl;;
}void f(int &)
{std::cout << "f(int &)" << std::endl;
}int test_nullptr3()
{f(nullptr); // f(int *)// try one of the following lines insteadf((int *) nullptr); // f(int *)f(0); // f(int *)f(NULL); // f(int *)//f((int &) nullptr); // error C2101: 常量上的“&”return 0;
}//
// reference: http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html
void func(int n)
{std::cout << "func (int n)" << std::endl;
}void func(char *s)
{std::cout << "func (char *s)" << std::endl;
}int test_nullptr4()
{func(0); // func (int n)func(NULL); // func (int n)func(nullptr); // func (char *s)return 0;
}//
// reference: http://www.learncpp.com/cpp-tutorial/6-7a-null-pointers/
void doSomething(int *ptr)
{if (ptr)std::cout << "You passed in " << *ptr << '\n';elsestd::cout << "You passed in a null pointer\n";
}void doSomething_(std::nullptr_t ptr)
{std::cout << "in doSomething_()\n";
}int test_nullptr5()
{int* a = NULL; // ok//int* b = (void*)0; // error C2440: “初始化”: 无法从“void *”转换为“int *”int* c = 0; // ok// the argument is definitely a null pointer (not an integer)doSomething(nullptr); // You passed in a null pointerdoSomething(0); // You passed in a null pointerdoSomething(NULL); // You passed in a null pointer// call doSomething_ with an argument of type std::nullptr_tdoSomething_(nullptr); // in doSomething_()return 0;
}
GitHub:https://github.com/fengbingchun/Messy_Test
相关文章:

埃森哲、亚马逊和万事达卡抱团推出的区块链项目有何神通?
据外媒报道,今日埃森哲宣布了一项新的区块链项目,该项目为基于区块链的循环供应链,将与万事达卡和亚马逊共同合作。据官方介绍,这个基于区块链的循环供应链能够让客户识别供应链上的小规模供应商和种植者,例如…

小团队如何玩转物联网开发?
近几年来,物联网发展迅速:据中商产业研究院《2016——2021年中国物联网产业市场研究报告》显示,预计到2020年,中国物联网的整体规模将达2.2万亿元,产业规模比互联网大30倍。与之相反的是,物联网开发者在开发…

Build Boost C++ libraries for x32/x64 VC++ compilers on Windows
2019独角兽企业重金招聘Python工程师标准>>> Boost is a set of libraries for the C programming language that provide support for tasks and structures such as linear algebra, pseudorandom number generation, multithreading, image processing, regular …

C++11中auto的使用
在C语言中,就有了auto关键字,它被当作是一个变量的存储类型修饰符,表示自动变量(局部变量)。它不能被单独使用,否则编译器会给出警告。在C11标准中,添加了新的类型推导特性。在C 11中,使用auto定义的变量不…
攻和防谁更厉害?AI技术在恶意软件检测中的应用和对抗
AI技术的发展为网络安全带来新机遇的同时,黑客也在逐渐利用AI漏洞建立对抗样本以躲避攻击,双方在各自领域的更多尝试也将是AI技术发展的一场新博弈。那么,在应用中,如何利用AI检测技术与恶意软件展开对抗? 腾讯安全技术…

一文看懂机器学习中的常用损失函数
作者丨stephenDC编辑丨zandy来源 | 大数据与人工智能(ID: ai-big-data)导语:损失函数虽然简单,却相当基础,可以看做是机器学习的一个组件。机器学习的其他组件,还包括激活函数、优化器、模型等。本文针对机…

Using Apache2 with JBoss AS7 on Ubuntu
大体思路同《Using Apache Web Server with Jboss AS 7》一致,但在Ubuntu上的操作与之前有些区别。 这里仍然演示mod_proxy的配置。 首先加载相应的模块。Ubuntu中加载模块和卸载模块均可以通过命令操作,与其对应的命令分别是a2enmod和a2dismod。 启用…
OpenCV代码提取:rotate函数的实现
OpenCV中并没有直接提供实现rotate的函数,这里通过getRotationMatrix2D和warpAffine函数实现rotate,并增加了一个crop参数,用来判断是否进行crop。目前支持uchar和float两种类型,经测试,与OpenCV3.1结果完全一致。公式…
在 Node.js 中用子进程操作标准输入/输出
翻译:疯狂的技术宅原文:http://2ality.com/2018/05/chi... 本文首发微信公众号:jingchengyideng欢迎关注,每天都给你推送新鲜的前端技术文章 在本中,我们在 Node.js 中把 shell 命令作为子进程运行。然后异步读取这些进…

再见,Python 2.x
整理 | 屠敏来源 | CSDN(ID:CSDNnews)在技术的长河中,软件、工具、系统等版本的迭代本是常事,但由于使用习惯、版本的兼容性、易用性等因素,很多用户及开发者在使用或做开发的过程中,并不愿意及…

Android UI系列-----CheckBox和RadioButton(1)
主要记录一下CheckBox多选框和RadioGroup、RadioButton单选框的设置以及注册监听器 1.CheckBox 布局文件: <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android…

C++中struct的使用
C语言继承了C语言的struct,并且加以扩充。在C语言中struct是只能定义数据成员,而不能定义成员函数的。而在C中,struct类似于class,在其中既可以定义数据成员,又可以定义成员函数。结构类型是用户定义的复合类型&#x…

填报表中也可以添加 html 事件
在实际的项目开发中,填报表的应用十分广泛。 多数情况下,填报表会作为整个项目的一部分配合需求灵活使用,但有时也会受大项目环境的影响,产生一些特别的要求。比如,通常报表单元格的数据类型大多是文本,有时…

60+业内技术专家,9大核心技术专题,AI ProCon倒计时一周!
2018 年,由 CSDN 举办的第一届 AI 开发者大会喊出“只讲技术,拒绝空谈”,两天会议时间,国内外几十家顶尖科技企业讲述了其主流技术及其应用案例,真正引领国内开发者紧跟技术浪潮。一年过去,在你还未有所觉察…

密码学研究-数字签名
引入:提到签名,大家都不陌生,大家知道,重大的文件一般都要领导签名,来确保这个文件的真实有效。而一些比较重要的合同,比如买房的购房合同,都要盖“骑缝章”,这个骑缝章,…
C++11中shared_ptr的使用
在C中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化;delete,接受一个动态对象的指针,销毁该对象,…

colly源码学习
colly源码学习 colly是一个golang写的网络爬虫。它使用起来非常顺手。看了一下它的源码,质量也是非常好的。本文就阅读一下它的源码。 使用示例 func main() {c : colly.NewCollector()// Find and visit all linksc.OnHTML("a[href]", func(e *colly.HTM…

可惜了,你们只看到“双马会”大型尬聊
作者 | 夕颜出品 | AI科技大本营(ID:rgznai100)导读:2019 年 8 月 29 日,世界人工智能大会(WAIC)在上海正式拉开帷幕。开幕式上,最让人瞩目的莫过于阿里巴巴前 CEO 马云与特斯拉 CEO Elon Musk …

Java 过滤特殊字符的 正则表达式
Java正则表达式学习: 因为正则表达式是一个很庞杂的体系,此例仅举些入门的概念,更多的请参阅相关书籍及自行摸索。 \\ 反斜杠 \t 间隔 (\u0009) \n 换行 (\u000A) \r 回车 (\u000D) \d 数字 等价于[0-9] \D 非数字 等价于[^0-9] \s 空…
C++11中unique_ptr的使用
在C中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化;delete,接受一个动态对象的指针,销毁该对象,…

从这篇YouTube论文,剖析强化学习在工业级场景推荐系统中的应用
作者 | 吴海波转载自知乎用户吴海波【导读】本文作者根据两篇工业界背景的论文解答了 RL 在推荐场景需要解决的问题与困难,以及入门需要学习得相关知识点。2 个月前,业界开始流传 youtube 成功将 RL 应用在了推荐场景,并且演讲者在视频中说是…

java中两个Integer类型的值相比较的问题
转载自: https://www.cnblogs.com/xh0102/p/5280032.html 两个Integer类型整数进行比较时,一定要先用intValue()方法将其转换为int数之后再进行比较,因为直接使用比较两个Integer会出现问题。 总结: 当给Integer直接赋值时&#x…

C#共享内存实例 附源码
原文 C#共享内存实例 附源码 网上有C#共享内存类,不过功能太简单了,并且写内存每次都从开头写。故对此进行了改进,并做了个小例子,供需要的人参考。 主要改进点: 通过利用共享内存的一部分空间(以下称为“数据信息区”…
C++11中weak_ptr的使用
在C中,动态内存的管理是通过一对运算符来完成的:new,在动态内存中为对象分配空间并返回一个指向该对象的指针,可以选择对对象进行初始化;delete,接受一个动态对象的指针,销毁该对象,…

经典不过时,回顾DeepCompression神经网络压缩
作者 | 薰风初入弦转载自知乎导读:本文作者为我们详细讲述了 ICLR 2016 的最佳论文 Deep Compression 中介绍的神经网络压缩方法。神经网络压缩一直是一个重要的研究方向,而目前业界最认可的压缩方法莫过于 ICLR 2016 的最佳论文 Deep Compression&#…

区块链技术特点之去中心化特性
想知道更多关于区块链技术知识,请百度【链客区块链技术问答社区】 链客,有问必答!! 由于区块链技术去中心化的特性,其在我们生活中的很多重要领域(如金融、管理)等方面具有重要的意义。例如&…

Android APK反编译
转自:http://blog.csdn.net/ithomer/article/details/6727581 一、Apk反编译得到Java源代码 下载上述反编译工具包,打开apk2java目录下的dex2jar-0.0.9.9文件夹,内含apk反编译成java源码工具,以及源码查看工具。 apk反编译工具dex…
Java泛型进阶 - 如何取出泛型类型参数
在JDK5引入了泛型特性之后,她迅速地成为Java编程中不可或缺的元素。然而,就跟泛型乍一看似乎非常容易一样,许多开发者也非常容易就迷失在这项特性里。多数Java开发者都会注意到Java编译器的类型擦除实现方式,Type Erasure会导致关…

C++11中override的使用
override是C11中的一个继承控制关键字。override确保在派生类中声明的重载函数跟基类的虚函数有相同的声明。 override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配ÿ…

平头哥发布一站式芯片设计平台“无剑”,芯片设计成本降低50%
导读:8 月 29 日,在上海举行的世界人工智能大会上,阿里巴巴旗下半导体公司平头哥发布 SoC 芯片平台“无剑”。无剑是面向 AIoT 时代的一站式芯片设计平台,提供集芯片架构、基础软件、算法与开发工具于一体的整体解决方案ÿ…