C++中的NULL和nullptr的区别

如果使用 nullptr 初始化对象,就能避免 0 指针的二义性的问题。 

NULL在C语言中被定义为

#define NULL ((void *)0)

NULL在c++中被定义为

#ifdef __cplusplus

#define NULL 0

#else

#define NULL ((void *)0)

#endif

而void *任何类型的指针都可以直接赋值给它,无需进行强制类型转换。

也就是说NULL实际上是一个void 的指针,然后吧void 指针赋值给int 和foo_t 的指针的时候,隐式转换成相应的类型。而如果换做一个C++编译器来编译的话是要出错的,因为C++是强类型的,void *是不能隐式转换成其他指针类型的。

(强类型即一旦变量被指定某个数据类型,如果不经强制转换,即永远是此数据类型。)

因为C++中不能将void *类型的指针隐式转换成其他指针类型,而又为了解决空指针的问题,所以C++中引入0来表示空指针(注:0表示,还是有缺陷不完美),这样就有了类似上面的代码来定义NULL。实际上C++的书都会推荐说C++中更习惯使用0来表示空指针而不是NULL,尽管NULL在C++编译器下就是0。

但是当你重载的时候

void fun(sometype1 a, sometype2 *b);

void fun(sometype1 a, int i);

使用fun(a,NULL)和fun(a,0)就不能很好的区分。

可以使用bar(a, static_cast(0));

static_cast 只能用于良性转换,这样的转换风险较低,一般不会发生什么意外,例如:

  • 原有的自动类型转换,例如 short 转 int、int 转 double、const 转非 const、向上转型等;
  • void 指针和具体类型指针之间的转换,例如void *int *char *void *等;
  • 有转换构造函数或者类型转换函数的类与其它类型之间的转换,例如 double 转 Complex(调用转换构造函数)、Complex 转 double(调用类型转换函数)。

我们在C++ 11中使用nullptr来表示空指针。

所以说在写c的时候可以使用NULL,但是c++应该尽量把NULL换成nullptr

 

 

你可能感兴趣的:(C++)