NULL和nullptr的区别
- nullptr是在C11中才被加入标准的关键字,原来给指针赋初始值
- 首先我们来看一下C语言和C++中的NULL是什么
// c语言
#define NULL ((void*)0)
#define NULL 0
- 因为c语言中可以隐式类型转换,所以NULL赋给指针,使用上面两宏定义都可以
// C++
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void*)0)
#endif
- 在C++中NULL被定义为常量0,而不是((void*)0),是因为C++是强类型语言,void指针不能隐式转换成其他类型的指针,所以就定义成((void *)0)
例如:
// c++环境中
int *p = NULL; // NULL被定义为0
int *p = (int*)NULL; // NULL被定义为((viod*)0)
- 所以在C++中NULL中就定义成0,但是有时候为了方便又会有其他的错误
例如下例:
#include<iostream>
#include<cstdio>
using namespace std;
void func(int address) {
cout << "address is a number" << endl;
}
void func(int* address) {
cout << "address is a pointer" << endl;
}
int main()
{
func(NULL);
func(nullptr);
return 0;
}
- 在这个例子中,第一个使用NULL调用func函数会输出 adderess is a number, 而第二个使用nullpter调用函数func就会打印 address is a pointer
- 此时就就体现了NULL在C++中的二义性了,明明我们使用NULL是要调用第二个函数,但是却调用第一个函数,这有两个原因:首先NULL在C++中被定义为0,然后就是由于C++中的函数匹配机制,所以在C11中添加了nullptr
在C++中nullptr的定义如下:
const //常量
class
{
public:
template<class T>
operator T*() const //向任意类型的非成员指针转换
{
return 0;
}
template<class C, class T>
operator T C::*() const //向任意类型的成员指针转换
{
return 0;
}
private:
void operator&() const // 不可取地址
{
}
} nullptr = {};
- 在C11中,nullptr实质上被当作一个常量,可以进行任意指针类型的转换,且不能够被取地址
**总结:**从C11之后我们给指针赋值应该是要nullptr,而C语言中因该是要NULL,以免以后在开发中出现细微的问题