nullptr是C++11引入的空指针字面量,类型为std::nullptr_t,专用于指针,避免与整型混淆;NULL是传统宏,常定义为0,易引发类型推导错误和重载歧义;应优先使用nullptr以提升类型安全和代码清晰性。

nullptr 是 C++11 引入的一个关键字,用来表示空指针,而 NULL 是传统 C 和 C++ 中用于表示空指针的宏。它们在语义和使用上存在关键区别,主要体现在类型安全和函数重载解析方面。
NULL 通常被定义为整数 0 或 (void*)0(在 C++ 中一般为 0),本质上是一个整型常量。这意味着在类型推导和函数重载时,NULL 可能被当作整数处理,从而引发歧义。
nullptr 是一个独立的字面量,其类型为 std::nullptr_t,专门用于表示空指针。它只能隐式转换为指针类型,不会与整数类型混淆。
例如:void func(int);
void func(char*);
func(NULL); // 调用 func(int),因为 NULL 是 0,优先匹配整型
func(nullptr); // 调用 func(char*),因为 nullptr 是指针类型
在模板编程中,使用 NULL 可能导致类型推导错误。
立即学习“C++免费学习笔记(深入)”;
示例:template <typename T>
void foo(T* ptr) { }
foo(NULL); // T 被推导为 int,但语义上我们希望它是某种指针类型
foo(nullptr); // T 被正确推导为指针所指类型,更安全
当函数重载涉及整型和指针类型时,传入 NULL 可能导致编译错误或调用非预期的函数。
例如:void bar(int);
void bar(void*);
// bar(NULL); // 错误:调用不明确,两个函数都匹配
bar(nullptr); // 明确调用 bar(void*)
使用 nullptr 可以消除这种歧义,使代码意图更清晰。
在 C++11 及以后的标准中,应优先使用 nullptr 来表示空指针。它更安全、语义更明确,能避免因类型混淆导致的错误。NULL 虽仍可使用,但已逐渐被 nullptr 取代。
基本上就这些 —— nullptr 是为指针而生的空值字面量,而 NULL 是一个容易被误用的整型宏。用 nullptr,代码更健壮。
以上就是C++11引入的nullptr和传统的NULL有什么区别的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号