nullptr空指针

nullptr空指针

C++11 引入的 nullptr,本质上是为了替代老写法里的 NULL0。它解决的核心问题不是“能不能表示空指针”,而是“能不能明确、无歧义地表示空指针”。

1. 老问题出在哪里?

在旧代码里,空指针经常这样写:

1
2
int* p = NULL;
int* q = 0;

这在很多情况下能工作,但 NULL 本质上往往只是一个整数常量宏。
一旦遇到函数重载,问题就会暴露出来。

1
2
3
4
5
6
7
8
9
void func(int)
{
}

void func(char*)
{
}

func(NULL); // 可能调用到 int 版本

这显然不是我们想要的结果。

2. C++11 的 nullptr

nullptr 是一个专门用于表示空指针的关键字:

1
int* p = nullptr;

它的类型是 std::nullptr_t,不是普通整数,因此在重载解析里更安全。

3. 最典型的好处:函数重载更准确

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;

void func(int)
{
cout << "func(int)" << endl;
}

void func(char*)
{
cout << "func(char*)" << endl;
}

int main()
{
func(nullptr);
return 0;
}

输出:

1
func(char*)

这就是 nullptr 的价值所在。

4. 常见使用场景

4.1 初始化空指针

1
2
int* p = nullptr;
std::string* s = nullptr;

4.2 指针判空

1
2
if (p == nullptr) {
}

4.3 智能指针判空

1
std::unique_ptr<int> ptr = nullptr;

5. 和 NULL 的区别

NULL

  • 多数实现里本质是 0(void*)0
  • 在重载场景下可能产生歧义

nullptr

  • 专门表示空指针
  • 类型明确
  • 更适合现代 C++

6. 使用建议

如果项目已经是 C++11 及以上标准,那么新代码里基本就没有继续使用 NULL 的必要了。
统一改用 nullptr,会更清楚,也更安全。

总结

nullptr 虽然看起来只是一个很小的语法点,但它解决的是老 C++ 里一个很实际的问题:空指针和整数常量混在一起。
在现代 C++ 代码里,用 nullptr 替代 NULL,基本已经算是默认写法了。