描述C++11中的nullptr与C++98中的NULL的区别。
在C++11中,引入了nullptr
关键字,它是一个特殊的空指针字面量,用于解决C++98中使用NULL
带来的一些问题。
C++98中的NULL:
NULL
在C++98中通常被定义为0
或者((void*)0)
,它是一个宏。- 使用
NULL
时存在一些问题,例如:NULL
实际上是整数0
,这可能导致类型模糊,尤其是在函数重载的情况下。- 使用
NULL
作为指针的字面量时,编译器可能无法确定其类型,这可能会导致一些意外的行为。
C++11中的nullptr:
nullptr
是一个特殊的字面量,它有自己的类型nullptr_t
,可以自动转换为任何指针类型,但不能转换为整数类型。- 使用
nullptr
可以避免C++98中使用NULL
时的类型模糊问题,使代码更加清晰和安全。 - 在函数重载的场景下,
nullptr
可以明确地表示空指针,从而避免与整数0
的混淆。
示例:
假设我们有两个重载的函数:
void func(int x) {
// 处理整数
}
void func(int* ptr) {
// 处理指针
}
在C++98中,调用func(NULL)
时,NULL
会被解释为整数0
,因此会调用第一个重载函数。而在C++11中,调用func(nullptr)
时,nullptr
会被识别为指针类型,因此会调用第二个重载函数。
总的来说,C++11中引入的nullptr
提供了一种更安全、更明确的方式来表示空指针,解决了C++98中使用NULL
可能导致的一些问题。