0

0

C++里的nullptr为什么比NULL更安全?(强类型检查防止重载歧义)

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-09 00:29:07

|

574人浏览过

|

来源于php中文网

原创

nullptr 是类型安全的空指针字面量,只能隐式转换为指针类型而不会转为整数;NULL 是宏(常为0),在重载函数中易引发歧义匹配。

c++里的nullptr为什么比null更安全?(强类型检查防止重载歧义)

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

nullptr 在 C++11 中被引入,本质是 std::nullptr_t 类型的纯右值,只能隐式转换为任意指针类型(包括成员指针),但**不会转换为整数类型**。而 NULL 通常是宏定义,比如 #define NULL 0#define NULL ((void*)0) —— 前者是 int,后者在 C++ 中不合法(C++ 禁止 void* 隐式转其他指针),所以实际编译器常退化为 00L

重载函数调用时避免歧义

当存在多个重载函数,参数分别是 intchar*(或任意指针)时,传 NULL 可能意外匹配 int 版本:

void foo(int) { std::cout << "int\n"; }
void foo(char*) { std::cout << "char*\n"; }

foo(NULL); // 输出 "int"(取决于 NULL 定义,但常见行为) foo(nullptr); // 编译错误?不,它只匹配 char → 输出 "char"(唯一可行转换)

这是因为 nullptr 不能转成 int,而 NULL(若为 0)是 int,优先匹配 int 重载。

模板推导和 auto 推导更可靠

NULL 初始化模板参数或 auto 变量,类型可能不是你想要的:

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

HyperWrite
HyperWrite

AI写作助手帮助你创作内容更自信

下载
  • auto p = NULL;p 类型是 int(不是指针!)
  • auto p = nullptr;p 类型是 std::nullptr_t,后续赋值给任何指针都合法
  • 模板函数如 template void bar(T*); bar(NULL);T 推导失败(NULL 不是指针类型),而 bar(nullptr) 可正确推导出 T

与 sizeof、函数指针等场景的兼容性

nullptr 的大小始终与指针一致(sizeof(nullptr) == sizeof(void*)),且可直接赋值给函数指针:

void func() {}
void (*fp)() = nullptr;  // 合法
// void (*fp)() = NULL;   // 若 NULL 是 0,则 error:cannot convert 'int' to 'void (*)()' 

某些平台对 NULL 宏的实现不统一,尤其跨编译器或混用 C/C++ 头文件时,nullptr 彻底规避了宏展开和整数/指针二义性问题。

真正容易被忽略的是:即使项目已全面使用 nullptr,第三方 C 头文件里仍可能带 NULL 宏;若你在 C++ 中写 if (p == NULL),虽能编译,但已失去类型安全优势——这种写法应一律改为 p == nullptr 或更推荐的 !p

相关专题

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

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

231

2023.09.22

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

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

435

2024.03.01

typedef和define区别
typedef和define区别

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

107

2023.09.26

define的用法
define的用法

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

325

2023.10.11

if什么意思
if什么意思

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

723

2023.08.22

string转int
string转int

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

315

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

531

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

50

2025.08.29

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

60

2026.01.09

热门下载

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

精品课程

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

共94课时 | 6.3万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.6万人学习

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

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