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

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

为什么优先选用 nullptr

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

传统问题

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

nullptr 的优势

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

使用示例

场景 1:避免重载歧义

cpp 复制代码
void foo(int);    // 重载1:接受整数  
void foo(char*);  // 重载2:接受指针  

foo(0);      // 调用 foo(int),可能不符合预期  
foo(NULL);   // 可能编译失败或调用 foo(int)  
foo(nullptr); // 明确调用 foo(char*)  

场景 2:模板与类型推导

cpp 复制代码
template<typename T>  
void bar(T* ptr);  

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

需要兼容旧代码时

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

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

总结

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

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

相关推荐
华科大胡子7 天前
条款06(缺点):当auto推导的类型不符合要求时,使用显式类型初始化惯用法
auto·modern c++·类型推导
weixin_461769408 天前
通过数组和队列构造二叉树方法(用于算法测试),C++ vector不能直接使用null
数据结构·c++·算法·vector·nullptr·null
繁华落尽,倾城殇?19 天前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
BestOrNothing_201519 天前
C++零基础到工程实战(5.2.5):函数默认参数和函数重载
c++·函数重载·函数默认参数·nullptr·函数声明与定义
华科大胡子1 个月前
条款05(优点):优先考虑auto类型推导,而非显式类型声明
闭包·auto·modern c++·类型推导
fffzd1 个月前
C++入门(二)
开发语言·c++·算法·函数重载·引用·inline内联函数·nullptr
叼烟扛炮1 个月前
C++第一讲:C++ 入门基础
开发语言·c++·函数重载·引用·内联函数·nullptr
H Journey2 个月前
C++ 11 新特性 类型安全的空指针常量nullptr
c++11·nullptr
奶人五毛拉人一块3 个月前
C++入门学习
开发语言·c++·函数重载·入门·nullptr