1.3、nullptr关键字(空指针常量)

在C++11之前,C++程序员一直用NULL或0来表示空指针。乍一看没啥问题,但只要你写过带有重载的代码,就会发现这俩其实是“定时炸弹”——它们本质上是整数类型,编译器在遇到重载时根本分不清你到底是想传个整数还是空指针。这种模糊不清,极易引发隐藏bug,尤其在大型项目和模板代码中,问题更为突出。

(加入我的知识星球,免费获取账号,解锁所有文章。)

为什么nullptr是C++11的必修课?

C++11引入了nullptr关键字,专门用来表示空指针。它有自己独特的类型std::nullptr_t,能自动转换成任何指针类型,但绝不会被当作整数参与重载决策。用大白话说:nullptr就是“我就是空指针,别把我当数字”。这让你的意图和编译器的理解终于达成了一致。

代码对比:老语法VS新语法

老语法的坑:

void func(int n) /*... */ }
void func(char* p) /*... */ }

func(0);    // 调用func(int)
func(NULL); // 还是调用func(int),因为NULL通常就是0

你本想让func(char*)被调用,结果却被当成整数处理了。

新语法的清晰:

void func(int n) /*... */ }
void func(char* p) /*... */ }

func(nullptr); // 只会调用func(char*)

nullptr一出场,编译器再也不会搞错你的意图。

设计哲学:类型安全与意图表达

nullptr的设计核心就是类型安全和意图明确。C++的类型系统本来就强调安全和精确表达,nullptr让“空指针”这个概念在语言层面彻底和整数分离。它不仅提升了代码的健壮性,也让阅读和维护变得更简单直接。你看到nullptr,就知道这里是指针操作,而不是模棱两可的数字。

最佳使用场景

  • • 初始化指针变量: int* p = nullptr;
  • • 函数参数或返回值: Node* find() { return nullptr; }
  • • 重载和模板场景: 任何涉及指针和整数重载的地方,nullptr都能让类型推导更安全。
  • • 智能指针和资源管理: 用nullptr表示“无资源”状态,逻辑更清晰。

实际项目中的优缺点

优点:

  • • 彻底消除因NULL或0导致的重载和模板歧义,类型安全大幅提升。
  • • 代码表达力更强,意图一目了然,维护和协作都更高效。
  • • 兼容性好,现代编译器全面支持,迁移成本低。

缺点:

  • • 只在C++11及以上标准下可用,极老的代码库如果不能升级编译器,短期内无法用上。
  • • 不能直接赋值给整数类型(除了bool),但这反而是类型安全的体现。
    本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
阅读剩余
THE END