目录
1.前言
2.剖析NULL
3. 剖析nullptr
4.nullptr与NULL的区别
1.前言
为了保持良好的编程习惯,我们在声明某个变量时都应该给这个变量合适的初始值,不然容易出现不可预知的错误。对于指针来说更是如此,在c语言中我们就通常将暂时没有指向的指针置为NULL.
2.剖析NULL
NULL
是一个宏,通常被用来表示空指针。在C和C++的早期版本中,NULL
通常被定义为0或者((void*)0)
,用于表示一个无效或未初始化的指针。在传统的C头文件(stddef.h)中,可以看到如下代码
可以看到,NULL可能被定义为字面常量0,或者被定义为无类型指针(void*)的常量。不论采取何种定义,在使用空值的指针时,都不可避免的会遇到一些麻烦,比如
程序本意是想通过f(NULL)调用指针版本的f(int*)函数,但是由于NULL被定义成0,因此与程序的初衷相悖。字面常量0既可以是一个整形数字,也可以是无类型的指针(void*)常量,但是编译器默认情况下将其看成是一个整形常量,如果要将其按照指针方式来使用,必须对其进行强转(void*)0。
3. 剖析nullptr
nullptr
是 C++11 标准引入的新关键字,具有独立的类型std::nullptr_t
,用于表示空指针,不能被隐式转换为其他类型(nullptr本身就是一个唯一的类型)。它是为了解决使用NULL
宏在某些情况下可能导致的类型不明确、歧义或安全性问题而引入的。
4.nullptr与NULL的区别
下面是 nullptr
与 NULL
的主要区别:
类型安全:
nullptr
是一个特殊的空指针常量,具有独立的类型std::nullptr_t
。这使得nullptr
在类型安全性方面更可靠,因为它不能被隐式转换为其他类型。NULL
实际上是一个宏,通常被定义为0
或((void*)0)
。因此,NULL
在一些情况下可能会发生隐式类型转换,导致潜在的问题。可读性:
nullptr
更加明确地表示空指针的概念,使代码更易读,更容易理解。NULL
可能在某些上下文中引起歧义,因为它只是一个宏,其实际值可以是0
或其它。重载决议:
- 如果一个函数有重载版本,其中一个接受指针类型的参数,使用
nullptr
可以避免重载决议的歧义问题。因为nullptr
有独立的类型,可以更容易地选择正确的重载版本。NULL
在某些情况下可能导致重载决议的不确定性。nullptr与NULL的区别同样也是nullptr的优势,在日常编程中我们也应当多使用nullptr.