当前位置: 首页 > 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.lryc.cn/news/604392.html

相关文章:

  • RAG实战指南 Day 29:RAG系统成本控制与规模化
  • WebRTC核心组件技术解析:架构、作用与协同机制
  • mangoDB面试题及详细答案 117道(071-095)
  • Python深度挖掘:openpyxl与pandas高效数据处理实战指南
  • APM32芯得 EP.27 | 告别IDE,为APM32F411打造轻量级命令行开发工作流
  • 微服务消息队列之——RabbitMQ
  • .NET 10 中的新增功能系列文章2——ASP.NET Core 中的新增功能
  • PostGIS安装与pg_dump/pg_restore排错
  • flutter 记录一个奇怪的问题
  • 在 Mac 上用 Vagrant 安装 K8s
  • InfluxDB 3 数据库命名与创建全攻略:规范、限制与实战指南
  • 《零基础入门AI:传统机器学习核心算法解析(KNN、模型调优与朴素贝叶斯)》
  • GaussDB 数据库架构师(十二) 数据库对象修改审计设置
  • Redis学习------缓存穿透
  • llama factory本地部署常见问题
  • Git版本控制器
  • 人工智能与家庭:智能家居的便捷与隐患
  • gdb调试的限制和配置自动生成core
  • 2023 年 NOI 最后一题题解
  • 【C++篇】哈希扩展:位图和布隆过滤器+哈希切割
  • 【Lambda】flatMap使用案例
  • c++之基础B(第一课)
  • dify离线插件打包步骤
  • 在Trae中使用MoonBit月兔
  • 【编号65】广西地理基础数据(道路、水系、四级行政边界、地级城市、DEM等)
  • 在 Elasticsearch 8.19 和 9.1 中引入更强大、更具弹性和可观测性的 ES|QL
  • Buck的Loadline和DVS区别和联系
  • Jenkinsfile 报错
  • 一篇讲清Redis中常见数据类型的用法
  • Three.js 与 WebXR:初识 VR/AR 开发