我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C++中NULL与nullptr的区别对比

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C++中NULL与nullptr的区别对比

前言

在编写C程序的时候只看到过NULL,而在C++的编程中,我们可以看到NULL和nullptr两种关键字,其实nullptr是C++11版本中新加入的,它的出现是为了解决NULL表示空指针在C++中具有二义性的问题,为了弄明白这个问题,我查找了一些资料,总结如下。

一、C程序中的NULL

在C语言中,NULL通常被定义为:#define NULL ((void *)0)

所以说NULL实际上是一个空指针,如果在C语言中写入以下代码,编译是没有问题的,因为在C语言中把空指针赋给int和char指针的时候,发生了隐式类型转换,把void指针转换成了相应类型的指针。


int  *pi = NULL;
char *pc = NULL;

二、C++程序中的NULL

但是问题来了,以上代码如果使用C++编译器来编译则是会出错的,因为C++是强类型语言,void*是不能隐式转换成其他类型的指针的,所以实际上编译器提供的头文件做了相应的处理:


#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif

可见,在C++中,NULL实际上是0.因为C++中不能把void*类型的指针隐式转换成其他类型的指针,所以为了结果空指针的表示问题,C++引入了0来表示空指针,这样就有了上述代码中的NULL宏定义。

但是实际上,用NULL代替0表示空指针在函数重载时会出现问题,程序执行的结果会与我们的想法不同,举例如下:


#include <iostream>
using namespace std;
 
void func(void* i)
{
 cout << "func1" << endl;
}
 
void func(int i)
{
 cout << "func2" << endl;
}
 
void main(int argc,char* argv[])
{
 func(NULL);
 func(nullptr);
 getchar();
}

在这段代码中,我们对函数func进行可重载,参数分别是void*类型和int类型,但是运行结果却与我们使用NULL的初衷是相违背的,因为我们本来是想用NULL来代替空指针,但是在将NULL输入到函数中时,它却选择了int形参这个函数版本,所以是有问题的,这就是用NULL代替空指针在C++程序中的二义性。

三、C++中的nullptr

为解决NULL代指空指针存在的二义性问题,在C++11版本(2011年发布)中特意引入了nullptr这一新的关键字来代指空指针,从上面的例子中我们可以看到,使用nullptr作为实参,确实选择了正确的以void*作为形参的函数版本。

总结:

NULL在C++中就是0,这是因为在C++中void* 类型是不允许隐式转换成其他类型的,所以之前C++中用0来代表空指针,但是在重载整形的情况下,会出现上述的问题。所以,C++11加入了nullptr,可以保证在任何情况下都代表空指针,而不会出现上述的情况,因此,建议以后还是都用nullptr替代NULL吧,而NULL就当做0使用。

其他:在没有C++ 11的nullptr的时候,我们怎么解决避免这个问题呢?


const class nullptr_t
{
public:
    template<class T>
    inline operator T*() const
        { return 0; }
 
    template<class C, class T>
    inline operator T C::*() const
        { return 0; }
 
private:
void operator&() const;
} nullptr = {};

到此这篇关于C++中NULL与nullptr区别对比的文章就介绍到这了,更多相关C++ NULL与nullptr区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C++中NULL与nullptr的区别对比

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C++中NULL与nullptr的区别有什么不同

这篇文章主要介绍C++中NULL与nullptr的区别有什么不同,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、C程序中的NULL在C语言中,NULL通常被定义为:#define NULL ((void *)0)所
2023-06-15

mysql中null与(null)的区别

在 mysql 中,null 代表空值,不占用空间,而 (null) 是空字符串值,占用 1 字节空间。它们的区别包括:存储方式不同、比较方式不同、插入方式不同、聚合函数处理方式不同、索引使用不同。MySQL 中 NULL 与 (NULL)
mysql中null与(null)的区别
2024-05-01

mysql中null与(null的区别

mysql 中 null 和 (null) 区别如下:null 表示未知值,而 (null) 表示明确空值。null 不占用存储空间,而 (null) 占用一个字节。null 不等于任何值,而 (null) 等于它自己。null 用于表示缺
mysql中null与(null的区别
2024-05-01

sql中null与空的区别

sql 中 null 表示未知或不存在的值,拥有自己的数据类型,不能被索引,通常占用更少的存储空间,在布尔表达式中为 false;空表示空字符串,拥有字符串数据类型,可以被索引,被视为 true。使用 null 表示数据未知,使用空表示数据
sql中null与空的区别
2024-05-02

C++ 函数与宏的区别和优缺点对比

函数是运行时执行的代码块,可返回结果;宏是预处理时展开的常量或代码片段,不可返回结果。函数易读、可重用、代码可读性高,但效率低;宏编译开销小、性能优,但代码可读性差、难以调试。C++ 函数与宏的区别和优缺点对比函数与宏概述函数:代码块,
C++ 函数与宏的区别和优缺点对比
2024-04-11

C++ 内联函数与宏定义的区别对比

内联函数在编译时展开,宏定义在预处理时替换。内联函数:接受参数并具有返回类型可以访问局部变量性能优于宏定义可读性较强宏定义:不接受参数也没有返回类型无法访问局部变量性能劣于内联函数提供简洁语法并便于自文档化C++ 内联函数与宏定义的区别对比
C++ 内联函数与宏定义的区别对比
2024-04-28

java中的空串与null的区别

区别:空串是一个已经实例化之后的对象,是有内存空间的,只不过内存空间中存储的值为空;而null表示的是没有实例化的对象,不占内存空间。String aaa = "";//空串String bbb=null; //null值在线视频教程推荐:java课程例如:p
java中的空串与null的区别
2020-04-26

JS中Require与Import区别对比分析

这篇文章主要为大家介绍了JS中Require与Import区别对比分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-02

javascript中undefined与null的区别有哪些

今天小编给大家分享一下javascript中undefined与null的区别有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一
2023-07-02

关于synchronized、volatile、ReentrantLock的区别与对比

这篇文章主要介绍了关于synchronized、volatile、ReentrantLock的区别与对比,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-05-16

c++中::与.的区别

冒号 (::) 用于访问全局命名空间或类的静态成员,而句点 (.) 用于访问类的实例成员。例如,std::cout 使用 :: 访问全局命名空间中的函数,obj.instancevar 使用 . 访问类的实例成员变量。C++ 中 :: 与
c++中::与.的区别
2024-04-26

c++中=与==的区别

c++ 中 = 与 == 的区别:= 为赋值运算符,用于变量赋值;== 为相等比较运算符,用于比较操作数是否相等。C++ 中 = 与 == 的区别在 C++ 中,= 和 == 是两个不同的运算符,用于不同的目的。等号 == 是赋值运算
c++中=与==的区别
2024-04-26

Java中的对象与C++中的对象有什么区别

Java中的对象与C++中的对象有什么区别?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java中对象与C++中对象的放置安排的对比概要:Java中,所有的对象都存放在堆(He
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录