条款08:优先选用nullptr,而非0和NULL
2026/6/16 1:18:50 网站建设 项目流程

条款08:优先选用nullptr,而非0和NULL(Prefernullptrto0 and NULL

为什么优先选用nullptr

C++11 引入nullptr作为空指针字面量,解决了传统0NULL在语义和类型安全上的缺陷。

传统问题

  • 0本质是int类型,可能被隐式转换为整数或指针,导致重载歧义。
  • NULL通常是0的宏定义(如#define NULL 0),存在相同问题。

nullptr的优势

  • 类型安全:nullptrstd::nullptr_t类型,仅能隐式转换为指针类型,避免整数误用。
  • 重载解析更明确:编译器能正确区分指针和整数重载版本。
  • 代码清晰:明确表达“空指针”意图,而非数值零。

使用示例

场景 1:避免重载歧义

void foo(int); // 重载1:接受整数 void foo(char*); // 重载2:接受指针 foo(0); // 调用 foo(int),可能不符合预期 foo(NULL); // 可能编译失败或调用 foo(int) foo(nullptr); // 明确调用 foo(char*)

场景 2:模板与类型推导

template<typename T> void bar(T* ptr); bar(0); // 编译错误(T* 无法匹配 int) bar(nullptr); // T 推导为 void,或通过 static_cast 显式指定类型

需要兼容旧代码时

若需与遗留代码(使用NULL0)交互,仍可使用nullptr,因其能隐式转换为任何指针类型。反之则需显式转换:

int* p = nullptr; // 正确 int* q = NULL; // 兼容但非推荐 int* r = static_cast<int*>(nullptr); // 显式转换(罕见需求)

总结

  • 新代码:一律使用nullptr
  • 旧代码迁移:逐步替换NULL0的指针用法。
  • 类型安全:编译器会阻止nullptr误用于非指针场景。

通过统一使用nullptr,能显著提升代码的可读性和安全性,减少潜在的运行时错误。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询