nullptr与NULL
# nullptr与NULL
Created: March 19, 2024 1:04 PM
在C++中,nullptr
是C++11引入的一个新的字面量,它代表空指针。它的类型是std::nullptr_t
,可以转换成任何原生指针类型。使用**nullptr
代替之前的NULL
(通常被定义为0
或((void*)0)
)的主要目的是消除一些由于NULL
**本质上是整数导致的歧义和潜在的错误。
# 歧义的解释
在引入**nullptr
之前,NULL
被用来表示空指针。然而,因为NULL
通常被定义为0
**,所以它实际上是一个整数。这会导致在重载函数时出现歧义,特别是当一个函数接受整型参数,而另一个接受指针类型参数时。编译器可能无法确定调用哪个函数。
cppCopy code
void func(int x) {
// ...
}
void func(int* ptr) {
// ...
}
// 在调用时出现歧义
func(NULL); // 调用者意图可能是调用func(int* ptr),但NULL实际上可以是整数0
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# nullptr
解决了歧义
nullptr
的引入正是为了解决这种歧义。由于nullptr
有自己的类型std::nullptr_t
,编译器可以清楚地区分重载函数,确保调用正确。
cppCopy code
void func(int x) {
// ...
}
void func(int* ptr) {
// ...
}
// 使用nullptr,没有歧义
func(nullptr); // 明确地调用 func(int* ptr)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# nullptr
与NULL
的比较
- **
nullptr
提供了类型安全,避免了NULL
**可能引起的歧义和错误。 - **
nullptr
**可以被隐式转换为任何指针类型,但不可以转换为整数类型,这进一步防止了误用。 - 对于现代C++代码(C++11及之后版本),推荐使用**
nullptr
代替NULL
**。
综上所述,nullptr
不等同于之前的NULL
,而是一种更安全、更明确的空指针表示方式。
编辑 (opens new window)