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

一、背景和起源

NULL

  • 来源:C 语言。

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

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

    cpp 复制代码
    #define NULL 0

nullptr

  • 引入版本:C++11

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

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

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

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

cpp 复制代码
void func(int);
void func(char*);

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

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

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

cpp 复制代码
void func(int);
void func(char*);

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

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

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

示例一:NULL 引发歧义

cpp 复制代码
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 正确解析

cpp 复制代码
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,编译器可能会以为你传的是一个整数,而不是指针。

cpp 复制代码
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 是历史遗留的整数宏,容易出错,已被淘汰

相关推荐
恒者走天下13 分钟前
秋招落定,拿到满意的offer,怎么提高自己实际的开发能力,更好的融入团队
c++
python零基础入门小白34 分钟前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习
天若有情67342 分钟前
【c++】手撸C++ Promise:从零实现通用异步回调组件,支持链式调用+异常安全
开发语言·前端·javascript·c++·promise
无心水43 分钟前
【Python实战进阶】1、Python高手养成指南:四阶段突破法从入门到架构师
开发语言·python·django·matplotlib·gil·python实战进阶·python工程化实战进阶
学困昇1 小时前
C++中的异常
android·java·c++
q***31831 小时前
Windows安装Rust环境(详细教程)
开发语言·windows·rust
合作小小程序员小小店1 小时前
桌面安全开发,桌面二进制%恶意行为拦截查杀%系统安全开发3.0,基于c/c++语言,mfc,win32,ring3,dll,hook,inject,无数据库
c语言·开发语言·c++·安全·系统安全
合作小小程序员小小店1 小时前
桌面开发,超市管理系统开发,基于C#,winform,sql server数据库
开发语言·数据库·sql·microsoft·sqlserver·c#
Codeking__2 小时前
C++ 11 atomic 原子性操作
开发语言·c++
crescent_悦2 小时前
PTA L1-020 帅到没朋友 C++
数据结构·c++·算法