nullptr
- 前言
- 一、指针空值NULL
- 二、指针空值nullptr(C++11)
- C++98中的指针空值
- 三、NULL与nullptr的区别
- 总结
前言
nullptr
是C++11引入的一个新特性,用于表示空指针。它提供了一种类型安全的方式来区分空指针和非空指针,避免了传统空指针(如NULL
或0
)可能导致的类型不匹配问题。使用nullptr
可以提高代码的可读性和安全性。同时,nullptr
还可以与C++的智能指针(如std::unique_ptr
、std::shared_ptr
等)一起使用,更好地管理动态分配的内存。
一、指针空值NULL
指针空值NULL是一种特殊的指针值,表示指针不指向任何有效的内存地址。在C和C++中,可以使用NULL
宏定义表示空指针。当使用NULL
赋值给一个指针时,表示该指针不指向任何内存地址。
使用空指针可以用于以下情况:
- 初始化指针变量,避免野指针的问题。
- 在条件判断中判断指针是否为空。
- 作为函数的返回值,表示函数执行失败或者没有有效的返回值。
需要注意的是,访问空指针会导致程序崩溃或者产生未定义的行为,因此在使用指针之前,应该先判断指针是否为空。可以使用条件语句或者断言来判断指针是否为空。
二、指针空值nullptr(C++11)
指针空值nullptr
是C++11引入的一种特殊的空指针常量。在以前的C++标准中,常用的空指针常量是NULL
,它通常被定义为整数0
或者(void*)0
。然而,这样的定义可能会引起一些类型转换的问题,因为整数0可能会被隐式地转换为其他类型的指针,从而导致一些意想不到的错误。
为了解决这个问题,C++11引入了新的空指针常量nullptr
。nullptr
是一个特殊的关键字,它的类型是std::nullptr_t
,表示一个空指针常量。使用nullptr
定义空指针可以避免类型转换的问题,因为nullptr
只能被隐式地转换为指针类型,而不能被转换为整数类型。
C++98中的指针空值
在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下方式对其进行初始化:
void TestPtr()
{int* p1 = NULL;int* p2 = 0;// ……
}
NULL
实际是一个宏,在传统的C头文件(stddef.h
)中,可以看到如下代码:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
可以看到,NULL
可能被定义为字面常量0,或者被定义为无类型指针(void*
)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如:
void f(int)
{cout<<"f(int)"<<endl;
}
void f(int*)
{cout<<"f(int*)"<<endl;
}
int main()
{f(0);f(NULL);f((int*)NULL);return 0;
}
程序本意是想通过f(NULL)
调用指针版本的f(int*)
函数,但是由于NULL
被定义成0
,因此与程序的初衷相悖。
在C++98中,字面常量0既可以是一个整形数字,也可以是无类型的指针(void*
)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void *
)0。
注意:
-
在使用
nullptr
表示指针空值时,不需要包含头文件,因为nullptr
是C++11作为新关键字引入的。 -
在C++11中,
sizeof(nullptr)
与sizeof((void*)0)
所占的字节数相同。 -
为了提高代码的健壮性,在后续表示指针空值时建议最好使用
nullptr
。
三、NULL与nullptr的区别
NULL
和nullptr
都是表示空指针的关键字,但是在C++11之后,推荐使用nullptr
来表示空指针。
区别如下:
-
类型安全性:
NULL
实际上是一个宏定义,被定义为0
或者((void*)0)
,因此可以隐式地转换为任何指针类型。而nullptr
是一个关键字,且严格遵循类型安全规则,只能转换为指针类型。 -
重载:
nullptr
可以进行函数重载,而NULL
不可以。由于NULL
是一个宏定义,而宏展开是在编译阶段进行的,因此无法对NULL进行重载。 -
可读性:
nullptr
更加明确地表示空指针的含义,更易于阅读和理解。而NULL
可能会引起歧义,不容易分辨其具体的含义。
综上所述,推荐在C++11及以上版本中使用nullptr
来表示空指针。
总结
使用nullptr
定义空指针可以提高代码的可读性和安全性,因为它明确表明了指针的空值,避免了可能导致错误的类型转换。