C++ nullptr 和 NULL 的使用区别
1. 为什么会有nullptr的出现
目的:nullptr的出现主要是为了替代NULL。
那么,为什么要替代NULL呢?
在NULL的定义中存在会有2种方式,有的编译器会将NULL定义成0,有的编译器会将NULL定义成((void*)0)。
那么,这两种定义方式会对c++有什么区别呢?
在c++中不允许( void* )隐式的转成其他类型,在某些编译器把NULL定义成((void*)0)的情况下,当你定义变量去赋值NULL时候,NULL就会变定义为0。
另外,这种问题也会对c++的重载特性造成混乱。
接下来,进行代码演示
2. 代码演示
这里编写了MyClass类,里面有两个重载函数printf
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass() {}
~MyClass() {}
public:
void printf(char *) /*重载函数*/
{
cout << "This is char*" << endl;
}
void printf(int) /*重载函数*/
{
cout << "This is int" << endl;
}
};
int main(int argc, char **argv)
{
return 0;
}
接下来,我们new一个MyClass对象 a并调用成员函数printf,传入NULL
#include <iostream>
using namespace std;
class MyClass
{
public:
MyClass() {}
~MyClass() {}
public:
void printf(char *) /*重载函数*/
{
cout << "This is char*" << endl;
}
void printf(int) /*重载函数*/
{
cout << "This is int" << endl;
}
};
int main(int argc, char **argv)
{
MyClass a;
a.printf(NULL);
return 0;
}
调试结果

以上可以看到,传入NULL时,调用printf(int), 与我们的本意调用printf(char*)相违背。
我们看看编译现在把NULL定义为哪种方式,我使用的是vs2017

可以看到将NULL定义0
接下来,我们的主角nullptr就出场了,将主函数里面的调用方式修改一下
int main(int argc, char **argv)
{
MyClass a;
a.printf(nullptr);
return 0;
}
调试结果

可以看到调用的printf(char*),这样nullptr和NULL的区别就出来了。
另外,nullptr能隐式转换成各类型指针,可以看看以下代码

3. 总结
在现代c++编程中,如遇到要使用NULL的地方,就尽量使用nullptr去替代NULL吧。
C++ nullptr 和 NULL 的使用区别的更多相关文章
- string、Empty和null三者的区别
string.Empty和null三者的区别 本文转自 http://www.bitscn.com/pdb/dotnet/201003/181883.html 时间:2010-03-01 00:00 ...
- nullptr和NULL
nullptr是c++11中的关键字,表示空指针 要区分nullptr和NULL,首先要明白NULL的含义: NULL是一个宏定义,在c和c++中的定义不同,c中NULL为(void*)0,而c++中 ...
- null和""的区别
从字面上看,null表示空(用str==null判定),""表示空字符串(用str.equals("")或者str.length()==0判定) 问题一: nu ...
- iOS中使用nil NULL NSNULL的区别
nil NULL NSNULL的区别主要以下几点 1.nil:一般赋值给空对象 2.NLL:一般赋值给nil之外的其他空值.入SEL等. 3.NSULL:NSNULL只有一种方法+ (NSNull * ...
- js判断undefined类型,undefined,null,NaN的区别
js判断undefined类型 今天使用showModalDialog打开页面,返回值时.当打开的页面点击关闭按钮或直接点浏览器上的关闭则返回值是undefined 所以自作聪明判断 ...
- Javascript 中的非空判断 undefined,null, NaN的区别
JS 数据类型 在介绍这三个之间的差别之前, 先来看一下JS 的数据类型. 在 Java ,C这样的语言中, 使用一个变量之前,需要先定义这个变量并指定它的数据类型,是整型,字符串型,.... 但是 ...
- (转载)Javascript 中的非空判断 undefined,null, NaN的区别
原文地址:https://blog.csdn.net/oscar999/article/details/9353713 在介绍这三个之间的差别之前, 先来看一下JS 的数据类型. 在 Java ,C ...
- java中NULL与" "的区别
null是没有地址""是有地址但是里面的内容是空的 null和""的区别 问题一: null和""的区别 String s=null; st ...
- java中null和""的区别
问题一: null和""的区别 String s=null; s.trim()就会抛出为空的exception String s=""; s.trim()就不会 ...
随机推荐
- RHEL_高级磁盘管理(vdo、stratis)
RHEL高级磁盘管理-VDO VDO简介 Virtual Data Optimizer 通过数据去重.压缩的方式来优化存储空间. VDO层放置在现有块存储设备上,例如Raid设备.本地磁盘设备. LV ...
- Building SPEC CPU2006
https://developer.amd.com/wordpress/media/2012/10/building_speccpu.html Building SPEC CPU2006 This f ...
- centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息
centos下查看网卡,主板,CPU,显卡,硬盘型号等硬件信息 rose_willow rose_willow 发布于 2016/06/16 11:32 字数 902 阅读 405 收藏 0 点赞 0 ...
- Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题
Xshell 远程使用vim打开文件不能使用右键复制粘贴(右键显示可视)的问题 Debian9.4系统不能再VIM打开文件界面不能使用右键复制粘贴 root@debian:~# vim /usr/sh ...
- k8s集群部署(2)
一.利用ansible部署kubernetes准备阶段 1.集群介绍 基于二进制方式部署k8s集群和利用ansible-playbook实现自动化:二进制方式部署有助于理解系统各组件的交互原理和熟悉组 ...
- C语言规范:C89、C90、C95、C99
本文转载 [K&R C] 1978 年,Dennis Ritchie 和 Brian Kernighan 合作推出了<The C Programming Language>的第一版 ...
- Linux系统编程【5】——stty的学习
从文件的角度看设备 之前几篇文章介绍的编程是基于文件的.数据可以保存在文件中,也可以从文件中取出来做处理,再存回去.不仅如此,Linux操作系统还专门为这个东西建立了一套规则,就是前期介绍的" ...
- 2021 docker安装宝塔面板
拉取CentOS镜像 docker pull centos 创建 docker 容器 启动镜像,映射主机与容器内8888(宝塔面板).888(PHPMYADMIN)端口 -v 挂在目录 为了能够保存( ...
- 永远的ace 实验七 团队作业4—团队项目需求建模与系统设计(1)
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST/ 这个作业要求链接 https://www.cnblogs.com/nwnu-da ...
- RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比
RCNN系列.Fast-RCNN.Faster-RCNN.R-FCN检测模型对比 一.RCNN 问题一:速度 经典的目标检测算法使用滑动窗法依次判断所有可能的区域.本文则预先提取一系列较可能是物体的候 ...