0

0

c++中nullptr和NULL的区别_c++11空指针规范【基础】

穿越時空

穿越時空

发布时间:2026-01-30 15:45:32

|

244人浏览过

|

来源于php中文网

原创

NULL 不类型安全,易导致重载二义、模板推导失败;nullptr 是 C++11 引入的 std::nullptr_t 字面量,只转指针类型,保障类型安全与编译期检查。

c++中nullptr和null的区别_c++11空指针规范【基础】

为什么不能用 NULL 替代 nullptr

NULL 在 C++98/03 中本质是整数 0 或宏定义(如 #define NULL 0#define NULL ((void*)0)),它不是类型安全的。当函数重载存在 void f(int)void f(char*) 时,f(NULL) 会调用 f(int),而非预期的指针版本——这是最典型的二义性问题。

nullptr 是 C++11 引入的字面量,类型为 std::nullptr_t,可隐式转换为任意指针类型,但不会转换为整数类型。因此 f(nullptr) 必定匹配指针重载版本。

  • NULL 可能被编译器当作 int,导致模板推导失败(如 template void g(T*) 接收 NULL 时推导为 g
  • nullptr 在模板中能正确推导为指针类型,且支持 auto 推导: auto p = nullptr;p 类型是 std::nullptr_t
  • 某些旧头文件中 NULL 定义依赖于 __cplusplus 宏,跨平台或混合 C/C++ 编译时行为不一致

nullptr 的类型和隐式转换规则

nullptr 不是关键字而是字面量,其类型是唯一的 std::nullptr_t,定义在 中。它只能隐式转换为指针类型(包括成员指针),不能转为 boolint 或用户自定义类型(除非你显式提供接受 std::nullptr_t 的构造函数)。

  • 允许:int* p = nullptr;void (A::*mp)() = nullptr;if (p == nullptr)
  • 禁止:int x = nullptr;编译错误)、bool b = nullptr;(需写成 bool b = (p != nullptr);
  • 注意:nullptr0 在比较中等价,但语义完全不同;nullptr == 0 合法,但这是靠指针与整数的比较规则,不推荐这样写

在 C++11 及以后项目中如何安全迁移

已有代码大量使用 NULL 时,不能简单全局替换为 nullptr,尤其当涉及宏、函数参数或模板特化时。

AIPAI
AIPAI

AI视频创作智能体

下载

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

  • 优先替换函数调用中的 NULL:如 func(NULL)func(nullptr),这是最安全、收益最大的改动
  • 避免在宏定义里直接用 nullptr(如 #define SAFE_DELETE(p) do { delete p; p = nullptr; } while(0) 是 OK 的;但若宏用于 C 头文件则仍需保留 NULL
  • 模板代码中若曾用 NULL 做默认参数(如 template void foo(T* p = NULL)),应改为 = nullptr,否则实例化时可能因 T 非指针而编译失败
  • 第三方库接口若明确要求 const char*void*,传 nullptr 没问题;但若接口是 C 风格(如 some_c_api(int flag, void* data)),且文档说 “dataNULL 表示忽略”,那传 nullptr 依然合法——因为 nullptr 可转为任意指针类型

容易被忽略的边界情况

真正出问题的地方往往不在主干逻辑,而在细节交互处。

  • 使用 std::function 绑定空函数对象时:std::function f = nullptr; 合法,但 f() 会抛 std::bad_function_call;而 f = NULL 可能因类型不匹配编译失败
  • constexpr 上下文中:constexpr int* p = nullptr; 合法;但 constexpr int* q = NULL; 在某些老编译器上可能不被接受(因 NULL 展开为非字面量表达式)
  • 类成员初始化列表中:MyClass() : ptr(NULL) {} 应改为 : ptr(nullptr),否则若 ptr 是智能指针(如 std::unique_ptr),用 NULL 初始化可能触发隐式 int 构造,造成未定义行为

最麻烦的不是语法错误,而是那些“看起来能过编译、运行也不报错、但逻辑悄悄走歪”的情况——比如重载选错、模板实例化异常、或者跨模块 ABI 不一致。用 nullptr 就是把这类隐患从运行时提前到编译期暴露出来。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

236

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

458

2024.03.01

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

109

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

338

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

779

2023.08.22

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

97

2023.09.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

531

2023.09.20

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

463

2023.08.02

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

8

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 8万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号