当前位置: 首页 > news >正文

C++ 中 NULL 与 nullptr 有什么区别?

一、背景和起源

NULL

  • 来源:C 语言。

  • 本质:一个宏,代表数字 0

  • 示例(大多数系统的定义):

    #define NULL 0
    

nullptr

  • 引入版本:C++11

  • 本质:一个关键字,表示空指针的专用字面量。

  • 类型:std::nullptr_t,是一个专门为空指针定义的类型。 

二、类型层面上的根本区别

NULL —— 是个整数常量(int)

void func(int);
void func(char*);func(NULL);  // NULL是0,本质是int,调用func(int),指针重载无效!

        它不是指针类型,而是整数0,只有在编译器做隐式转换时,才“看起来像”是空指针。 

nullptr —— 是真正的空指针类型

void func(int);
void func(char*);func(nullptr);  // 正确调用func(char*),因为nullptr是指针类型

        它的类型就是 std::nullptr_t,只会被转换为任意类型的指针,而不会被转换为整数。

三、重载函数中的区别 —— 最直观的例子

示例一:NULL 引发歧义

void foo(int x) { std::cout << "int\n"; }
void foo(char* s) { std::cout << "pointer\n"; }foo(NULL);  // 输出 "int",不是你预期的 "pointer"

解释:

  • NULL0,类型是 int,因此匹配的是 foo(int)

示例二:nullptr 正确解析

void foo(int x) { std::cout << "int\n"; }
void foo(char* s) { std::cout << "pointer\n"; }foo(nullptr);  // 输出 "pointer",因为nullptr只能当作指针

解释:

  • nullptr 只能转换为 char*,匹配 foo(char*),避免了歧义。

四、模板编程中的区别

        在模板中,如果你传的是 NULL,编译器可能会以为你传的是一个整数,而不是指针。

template<typename T>
void test(T val) {std::cout << typeid(T).name() << std::endl;
}test(NULL);     // T 被推导为 int
test(nullptr);  // T 被推导为 std::nullptr_t

        这会影响你函数模板的行为,甚至可能报错。

nullptr 是 C++ 专门设计的空指针类型,安全、清晰、无歧义NULL 是历史遗留的整数宏,容易出错,已被淘汰

http://www.dtcms.com/a/306534.html

相关文章:

  • Redis 中 key 的过期策略 和 定时器的两种实现方式
  • 基于逻辑回归、随机森林、梯度提升树、XGBoost的广告点击预测模型的研究实现
  • 超宽带测距+测角+无线通信一体化跟随模组:机械狗、无人车、无人机等跟随
  • Dify-15: 开发指南
  • DIY循迹模块多路改造指南
  • 【WRF-Chem第三期】输入数据概览
  • 随笔之TDengine基准测试示例
  • LeetCode 25:K 个一组翻转链表
  • MCU中的CAN总线是什么?
  • WebRTC核心组件技术解析:架构、作用与协同机制
  • 一文掌握最新版本Monocle3单细胞轨迹(拟时序)分析
  • 如何将JPG、PNG、GIF图像转换成PDF、SVG、EPS矢量图像
  • Rust基础[part9]_返回值和错误处理、模块化
  • [特殊字符] 征服CPU的艺术:Rust多进程编程实战指南
  • Cortex-M处理器的优势?
  • STM32CubeIDE新建项目过程记录备忘(二)
  • FFmpeg:因码流采集与封装不同步导致录制出来的MP4文件会出现黑屏、绿屏的问题
  • Zynq SoC 中断控制系统设计与实现:基于 GPIO 的中断驱动开发
  • LocalDateTime vs Instant vs ZonedDateTime:到底该用哪个?
  • .net6的webapi项目统一封装返回值
  • 剧本杀系统 App 开发:科技赋能,重塑剧本杀游戏体验
  • 光伏气象监测系统:当阳光遇见科技
  • Javascript 基础总结
  • 做题笔记:某大讯飞真题28道
  • 浅拷贝和深拷贝
  • uni-app,uni.navigateTo
  • 【LangChain4j 详解】Java生态大语言模型框架设计哲学与架构原理
  • Node.js以及异步编程
  • vue模块化导入
  • 网络安全学习第16集(cdn知识点)