C++学习------空指针常量nullptr
·
- 操作系统:ubuntu22.04
- IDE:Visual Studio Code
- 编程语言:C++11
nullptr 是 C++11 引入的一个关键字,用于表示空指针常量。它是对传统 C 风格空指针(如 NULL 或 0)的重大改进,解决了类型安全和重载歧义等问题。
一、为什么需要 nullptr?
在 C++11 之前,通常用以下方式表示空指针:
int* p = 0; // 整数 0 被隐式转换为指针
int* q = NULL; // NULL 通常是 #define NULL 0
但这存在两个主要问题:
❌ 问题 1:类型不安全
void func(int);
void func(char*);
func(0); // 调用 func(int)!不是 func(char*)!
func(NULL); // 可能调用 func(int),取决于 NULL 的定义
意图是传空指针,结果调用了整数版本!
❌ 问题 2:模板推导失败
template<typename T>
void call(T ptr) {
// ...
}
call(0); // T 被推导为 int,不是指针类型!
二、nullptr 的优势 ✅
✅ 1. 类型安全
nullptr的类型是std::nullptr_t,可隐式转换为任何指针类型,但不能转换为整数。
void func(int);
void func(char*);
func(nullptr); // ✅ 正确调用 func(char*)
✅ 2. 清晰表达意图
int* p = nullptr; // 明确表示“这是一个空指针”
比 0 或 NULL 更具可读性。
✅ 3. 模板友好
template<typename T>
void call(T ptr) { /* ... */ }
call(nullptr); // T 推导为 std::nullptr_t,行为明确
✅ 4. 支持重载决议
void f(int*);
void f(std::shared_ptr<int>);
f(nullptr); // 可以正确匹配到 int* 版本(若无歧义)
三、nullptr 的特性
| 特性 | 说明 |
|---|---|
| 类型 | std::nullptr_t(定义在 <cstddef>) |
| 可转换为 | 任意指针类型(包括成员指针) |
| 不可转换为 | 整数、浮点数、bool(除非显式转换) |
| 可比较 | p == nullptr、p != nullptr 安全有效 |
| 布尔值 | 在条件中为 false:if (p) { ... } else { /* p is nullptr */ } |
四、使用示例
#include <iostream>
#include <memory>
void process(int* p) {
if (p == nullptr) {
std::cout << "Pointer is null\n";
} else {
std::cout << "Value: " << *p << "\n";
}
}
int main() {
int* raw_ptr = nullptr;
std::unique_ptr<int> smart_ptr = nullptr;
process(raw_ptr); // 输出: Pointer is null
process(nullptr); // 直接传 nullptr
if (!smart_ptr) {
std::cout << "Smart pointer is empty\n"; // 会输出
}
return 0;
}
五、与 NULL 和 0 的对比
| 写法 | 类型 | 是否推荐 | 原因 |
|---|---|---|---|
0 |
int |
❌ 不推荐 | 类型错误,易引发重载歧义 |
NULL |
通常是 int(如 #define NULL 0) |
❌ 不推荐 | 本质还是整数,非类型安全 |
nullptr |
std::nullptr_t |
✅ 强烈推荐 | 类型安全、语义清晰、C++ 标准化 |
📌 Google C++ Style Guide、C++ Core Guidelines 等均要求:始终使用
nullptr表示空指针。
六、注意事项
-
不要将
nullptr赋值给非指针类型:int n = nullptr; // ❌ 编译错误(C++11 起禁止) -
delete nullptr是安全的:int* p = nullptr; delete p; // ✅ 合法,无操作(no-op) -
与智能指针兼容:
std::shared_ptr<int> sp = nullptr; // 合法 if (sp == nullptr) { ... } // 合法
七、总结
✅ 在 C++11 及以后,永远使用
nullptr表示空指针!
它:
- 消除了
0/NULL的类型安全隐患 - 提高了代码可读性和健壮性
- 是现代 C++ 的标准实践
记住口诀:
“指针为空用
nullptr,告别NULL和0!”
更多推荐


所有评论(0)