C++里的nullptr和NULL有什么区别?(强类型指针常量)

发布时间 - 2026-01-09 00:00:00    点击率:
nullptr 是类型安全的空指针字面量,类型为 std::nullptr_t,可隐式转换为任意指针类型,但不转换为整数类型,从而避免 NULL 在重载中的二义性问题。

nullptr 是类型安全的空指针字面量

nullptr 是 C++11 引入的关键字,其类型是 std::nullptr_t,能隐式转换为任意指针类型,但**不会隐式转换为整数类型**。这直接解决了 NULL 在函数重载时的二义性问题。

常见错误现象:

void func(int) { std::cout << "int\n"; }
void func(char*) { std::cout << "ptr\n"; }
func(NULL); // 调用 func(int),不是预期的 ptr 版本
func(nullptr); // 正确调用 func(char*)

  • NULL 通常定义为 0((void*)0),在 C++ 中本质是整数或不兼容的 void* 类型
  • nullptr 的类型明确、唯一,编译器可据此做精确匹配
  • 所有现代标准(C++11 及以上)都应优先使用 nullptr

NULL 的定义依赖宏且行为不一致

NULL 不是语言关键字,而是头文件中定义的宏(如 #define NULL 0#define NULL ((void*)0)),具体展开取决于实现和包含的头文件( 等)。

  • 在 C++98/03 中,NULL 常被展开为 0,导致它和整数字面量完全等价
  • 某些旧编译器对 ((void*)0) 的处理可能违反 C++ 标准(void* 不能隐转为其他指针)
  • 混用 C 头文件(如 )时,NULL 行为更不可控

赋值和模板推导中 nullptr 更可靠

在需要显式类型信息的上下文中,nullptr 能让编译器准确推导指针意图;而 NULL 可能触发整数分支或推导失败。

立即学习“C++免费学习笔记(深入)”;

使用场景示例:

auto p = nullptr;        // p 类型是 std::nullptr_t
auto q = NULL; // q 类型是 int(如果 NULL 定义为 0)

template void take_ptr(T*);
take_ptr(nullptr); // OK:T 被推导为任意类型
take_ptr(NULL); // 错误:无法从 int 推导出 T*

  • nullptr 初始化智能指针(std::unique_ptr p = nullptr;)是标准写法
  • constexpr 上下文中,nullptr 是字面量常量,NULL 不一定满足要求
  • 静态断言中判断空指针也应基于 nullptr,比如 static_assert(std::is_same_v);

实际编码中应该彻底弃用 NULL

除了维护极老的 C++03 代码(且不打算升级标准),没有理由继续使用 NULL。它的“兼容性”代价远高于收益。

  • Clang 和 GCC 在 C++11+ 模式下会对 NULL 发出 -Wzero-as-null-pointer-constant 警告
  • 现代代码审查工具(如 clang-tidy)默认建议替换 NULL → nullptr
  • 即使跨平台,nullptr 在所有 C++11 兼容编译器中语义完全一致;NULL 则不然

真正容易被忽略的是:有些团队在头文件里自定义 #define NULL nullptr,看似省事,实则掩盖了历史代码中对 NULL 的整数误用——这种宏掩盖比直接删掉更危险。


# c++  # 区别  # 隐式转换  # NULL  # 常量  # define  # void  # 指针  # 指针类型  # 整数类型  # 函数重载  # pointer  # 空指针  # 转换为  # 头文件  # 隐式  # 性问题  # 的是  # 能让  # 会对  # 自定义  # 更不  # 但不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 高防服务器租用如何选择配置与防御等级?  高端网站建设与定制开发一站式解决方案 中企动力  如何自定义建站之星模板颜色并下载新样式?  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  MySQL查询结果复制到新表的方法(更新、插入)  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  Laravel如何实现本地化和多语言支持?(i18n教程)  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  黑客入侵网站服务器的常见手法有哪些?  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  网站建设要注意的标准 促进网站用户好感度!  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  简单实现jsp分页  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  如何在阿里云完成域名注册与建站?  Android okhttputils现在进度显示实例代码  Laravel如何使用Livewire构建动态组件?(入门代码)  高端建站如何打造兼具美学与转化的品牌官网?  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  三星、SK海力士获美批准:可向中国出口芯片制造设备  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  WEB开发之注册页面验证码倒计时代码的实现  详解MySQL数据库的安装与密码配置  php485函数参数是什么意思_php485各参数详细说明【介绍】  html5的keygen标签为什么废弃_替代方案说明【解答】  如何用西部建站助手快速创建专业网站?  如何快速完成中国万网建站详细流程?  Python图片处理进阶教程_Pillow滤镜与图像增强  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Android使用GridView实现日历的简单功能  Python并发异常传播_错误处理解析【教程】  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】  北京企业网站设计制作公司,北京铁路集团官方网站?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何用wdcp快速搭建高效网站?  如何生成腾讯云建站专用兑换码?  如何在Ubuntu系统下快速搭建WordPress个人网站?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  如何在万网主机上快速搭建网站?  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  js代码实现下拉菜单【推荐】  高端建站三要素:定制模板、企业官网与响应式设计优化