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()就不会 ...
随机推荐
- Ubuntu 获取升级信息失败。可能网络有问题
升级Ubuntu系统时遇到的这个问题, 原因是默认的源不是国内的,而且还可能导致下载慢等问题. 1.备份源 cd /etc/apt/ sudo cp sources.list sources.list ...
- Python基础之PyCharm快捷键大全
Pycharm中打开Help->Keymap Reference可查看默认快捷键帮助文档 一.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + A ...
- linux服务之FTP服务篇
一.FTP协议 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP (File Transfer ...
- python基础之错误、调试(异常处理)
在程序运行过程中,总会遇到各种各样的错误. 有的错误是程序编写有问题造成的,比如本来应该输出整数结果输出了字符串,这种错误我们通常称之为bug,bug是必须修复的. 有的错误是用户输入造成的,比如让用 ...
- 一次线上事故,让我对MySql的时间戳存char(10)还是int(10)有了全新的认识
美好的周五 周五的早晨,一切都是那么美好. 然鹅,10点多的时候,运营小哥哥突然告诉我后台打不开了,我怀着一颗"有什么大不了的,估计又是(S)(B)不会连wifi"的心情,自信的打 ...
- Python-名片管理器
# 需要完成的基本功能: # 添加名片 # 删除名片 # 修改名片 # 查询名片 # 退出系统 # 程序运行后,除非选择退出系统,否则重复执行功能 list_info = [] # 创建一个空列表 # ...
- Java核心技术卷阅读随笔--第4章【对象与类】
对 象 与 类 4.1 面向对象程序设计概述 面向对象程序设计(简称 OOP) 是当今主流的程序设计范型, 它已经取代了 20 世纪 70 年代的" 结构化" 过程化程序设计开发技 ...
- jenkins配置基于角色的项目权限管理设置步骤
jenkins配置基于角色的项目权限管理设置步骤 本文链接:https://blog.csdn.net/russ44/article/details/52276222 由于jenkins默认的权限管理 ...
- GO文件读写03---使用缓冲读写实现视频文件的拷贝
package main import ( "bufio" "fmt" "io" "os" ) /* ·使用缓冲读写实现 ...
- CVPR2020论文解析:视觉算法加速
CVPR2020论文解析:视觉算法加速 GPU-Accelerated Mobile Multi-view Style Transfer 论文链接:https://arxiv.org/pdf/2003 ...