C++高级特性:nullptr和NULL的区别(十)

1、NULL和0
  • 在C语言标准定义中,NULL的定义为(void *)0

    这样的代码意味着可以进行强制类型转换一个void *类型的指针到任意类型的指针

    #define NULL (void*)0
    char *p = NULL;
    
  • C++11之后NULL被定义为0,此时可以认为NULL不完全是一个空指针。

    #ifndef __cplusplus
    #define NULL ((void *)0)
    #else   /* C++ */
    #define NULL 0
    #endif  /* C++ */
    
    • C++是一门类型安全的语言,*无法将一个void 类型的指针隐式转换为其他类型

      char *p = 0;
      char *p1 = NULL;                    
      char *p2 = (void *)0;                              // 报错
      char *p3 = reinterpret_cast<char*>(NULL);          // 强转可以
      
    • 而这样又会引入另外一个重载的二义性问题

      因为NULL的值实际是0,但是char 也可以接收一个NULL(0)值,但是NULL又被定义为0值,这样就会导致一个二义性问题。

      void func(int )
      {std::cout << "func(int)" << std::endl;
      }
      void func(char *)
      {std::cout << "func(char *) " << std::endl;
      }void test1()
      {func(0);                                        // 调用func(int)
      //    func(NULL);                                   // 报错func(reinterpret_cast<char *>(NULL));           //强转可以调用func(char *)
      }
      
2、nullptr
  • 为了解决上面带来的二义性问题,C++11之后引入了nullptr来专门区分0和空指针。

  • nullptr的类型为std::nullptr_tnullptr是一个std::nullptr_t的纯右值

  • nullptr能够隐式的转换为任何指针,因此空指针的时候推荐使用nullptr

  • 而通过nullptr就可以解决上面的二义性问题

    void test2()
    {func(0);                                        // 调用func(int)func(nullptr);                                  // 调用func(char *)
    }
    
3、nullptr_t的定义
  • 可以看到nullptr被定义为nullptr_t类型
  • 同时nullptr_t的类型长度与void *长度相同
namespace std
{typedef __SIZE_TYPE__ 	size_t;typedef __PTRDIFF_TYPE__	ptrdiff_t;#if __cplusplus >= 201103Ltypedef decltype(nullptr)	nullptr_t;
#endif
}
static_assert(sizeof(std::nullptr_t) == sizeof(void *));
  • nullptr_t也可以定义一个其他指针的空指针对象并且与nullptr有相同的能力,而且被创建的对象是一个左值
void test3()
{std::nullptr_t null1;std::nullptr_t null2;std::cout << "&null1 = " << &null1 << std::endl;std::cout << "&null2 = " << &null2 << std::endl;
//    std::cout << "&nullptr = " << &nullptr << std::endl;            //报错,右值没有地址
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS仿真小车(一)—— urdf模型+rviz可视化

文章目录 前言一、创建功能包二、urdf文件三、launch文件四、图形化显示五、RVIZ可视化总结参考文献 前言 ROS学习过程记录&#xff0c;从零开始仿真一辆小车&#xff0c;之后会实现运动控制、雷达、相机等 部分代码已上传至本人的GitHub&#xff0c;如果需要请自行下载&…

算法题解记录18+++搜索二维矩阵Ⅱ

本题可以说是运用二分查找的典例&#xff0c;即使是面对矩阵&#xff0c;只要是它保持“排序好”这样的结构&#xff0c;就一定能采用二分查找法。【你知道的&#xff0c;对于排序好的数组&#xff0c;二分查找几乎是最优秀的算法】 当然&#xff0c;答案提供的是“Z字形查找法…

实在Agent:超自动化智能体的革命(附导引指南)

在自动化技术的浪潮中&#xff0c;实在智能推出了实在Agent&#xff08;智能体&#xff09;&#xff0c;一款基于大语言模型和屏幕语义理解技术的超自动化智能体。它通过自然对话交互&#xff0c;将复杂工作简化为一句话指令&#xff0c;自动规划并执行工作任务&#xff0c;极大…

C++奇迹之旅:深入理解赋值运算符重载

文章目录 &#x1f4dd;赋值运算符重载&#x1f320; 运算符重载&#x1f309;特性 &#x1f320; 赋值运算符重载&#x1f320;传值返回&#xff1a;&#x1f320;传引用赋值&#xff1a;&#x1f309;两种返回选择&#x1f309;赋值运算符只能重载成类的成员函数不能重载成全…

【御控物联】物联网数据传输数据格式

随着物联网技术的快速发展&#xff0c;越来越多的系统和设备被接入到了物联网管理中&#xff0c;数据交换与共享成为了一个重要的问题。不同的设备和系统之间存在着各种各样的通信协议和数据格式&#xff0c;这就给数据获取、交换和共享带来了很大的不便利。 MQTT 是机器对机器…

unity学习(86)——细节优化

东西已经做出来了&#xff0c;现在需要的是优化&#xff0c;说得简单&#xff0c;做起来难。 1.122包的优化&#xff0c;避免重复创建&#xff01; 2.为何会出现一边动&#xff0c;一边不动的情况。重复登录后依旧是unity可以看到移动&#xff0c;但是exe那边看不到移动&#…

关于图像YUV格式分类和排布方式的全学习

【学习笔记】关于图像YUV格式分类和排布方式的全学习_yuv图像-CSDN博客 下图是将多个yuv420p图像(A和B)&#xff0c;拼接成一个画面的思路 A大小:416*64 B大小:416*208 将A和B合并到一个416*416的尺寸上&#xff0c;代码如下 //整合char * ptd;ptd (char * ) malloc (416*41…

C#通用类库封装实战

数据库查询 特性方式获取数据库列的别名 数据库更新 使用简单工厂配置的方式

套接字基础

套接字基础 套接字一、socket二、setsockopt三、bind四、listen五、select六、poll七、epoll一、水平模式&#xff08;Level-Triggered&#xff0c;LT&#xff09;二、边沿模式&#xff08;Edge-Triggered&#xff0c;ET&#xff09; 套接字 最近学习网络编程的时候&#xff0c…

甲辰年半日闲有得

甲辰年半日闲有得 出入一世红尘客&#xff0c;得失九台江湖人。 纠结苦海他日心&#xff0c;​何须挂碍当下身。 ​曾是春风得意时&#xff0c;重游故地情念真。 ​忘我才知小境遇&#xff0c;利他方明大原本。

矽塔SA8321 单通道 2.7-12.0V 持续电流 3.0A H 桥驱动芯片

描述 SA8321是为消费类产品&#xff0c;玩具和其他低压或者电池供电的运动控制类应用提供了一个集成的电机驱动器解决方案。此器件能够驱动一个直流无刷电机&#xff0c;由一个内部电荷泵生成所需的栅极驱动电压电路和4个功率 NMOS组成H桥驱动&#xff0c;集成了电机正转/反…

2024上海国际半导体制造设备材料与核心部件展览会

2024上海国际半导体制造设备材料与核心部件展览会 2024 Shanghai International Semiconductor Manufacturing Equipment Materials and Core Components Exhibition 时间&#xff1a;2024年11月18日-20日 地点&#xff1a;上海新国际博览中心 详询主办方陆先生 I38&#…

2024蓝桥杯嵌入式模板代码详解

文章目录 一、STM32CubeMx配置二、LED模板代码三、LCD模板代码 一、STM32CubeMx配置 打开STM32CubeMx&#xff0c;选择【File】->【New Project】&#xff0c;进入芯片选择界面&#xff0c;搜索到蓝桥杯官方的芯片型号&#xff0c;并点击收藏&#xff0c;下次直接点击收藏就…

【LeetCode: 39. 组合总和 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

比特币减半倒计时:NFT 生态将受到怎样的影响?

BTC 减半倒计时仅剩不到 1 天&#xff0c;预计在 4 月 20 日迎来减半。当前区块奖励为 6.25 BTC&#xff0c;减半后区块奖励为 3.125 BTC&#xff0c;剩余区块为 253。比特币减半无疑是比特币发展史上最重要的事件之一&#xff0c;每当这一事件临近&#xff0c;整个加密社区都充…

每日三个JAVA经典面试题(四十二)

1.Java中的线程池如何帮助优化性能&#xff1f; Java中的线程池是一种重要的并发编程工具&#xff0c;它可以帮助优化性能的方式有以下几点&#xff1a; 资源管理&#xff1a;线程池可以管理并重用线程&#xff0c;而不是为每个任务都创建一个新的线程。这减少了线程创建和销毁…

Linux下SPI设备驱动实验:测试读取ICM20608设备中数据是否正常

一. 简介 前面文章实现了 SPI设备的读写功能&#xff0c;也对ICM20608设备中&#xff08;即SPI设备&#xff09;寄存器里的数据进行了读取。文章如下&#xff1a; Linux下SPI设备驱动实验&#xff1a;读取ICM20608设备的数据-CSDN博客 本文对驱动功能进行测试&#xff0c;即…

大数据平台搭建2024(二)

二&#xff1a;Hive安装 只在node01上操作 1 安装MySQL 8.0 最小化安装需要安装这个 yum install -y wget1-1 下载MySQL的yum源 wget http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm检查是否安装成功 rpm -qpl mysql80-community-release-el7-7.n…

c++使用spdlog库打日记

打日记 打日志的本质就是多输出&#xff0c;c没有自带的日志库&#xff0c;只能使用第三方库实现&#xff0c;当然&#xff0c;直接cout输出也可以&#xff0c;但是一般日志库都进行了优化&#xff0c;比我们使用cout输出的效率更高&#xff0c;同时效果也更好&#xff0c;这里…

解决navicat远程连接mysql 很慢(首次)

通过navicat链接的测试服务器的mysql数据库连接打开的很慢&#xff08;间隔一段时间没使用的情况,navicat 链接会自动断开&#xff0c;再次链接就很慢&#xff0c;之后就正常&#xff0c;平时没在意&#xff0c;今天有空就给他解决下&#xff09;&#xff0c;但是连接本地的mys…