BOOL、bool的区别 && NULL、0、nullptr的区别

一、BOOL、bool

1、类型不同

bool为布尔型、 BOOL为int型

2、长度不同

bool只有一个字节、BOOL为 int 因此长度根据实际环境来定,一般为4个字节

3、取值不同

bool取值 0为 false 、 非0为true;

BOOL取值 0 为false、1为true;


二、NULL、0、nullptr

1、定义不同

c语言中 NULL被定义为 #define NULL ((void *)0)

c++中NULL被定义为 #define NULL 0

nullptr是C++11中定义的

一般编译其的头文件会这么定义

#ifdef __cplusplus

#define NULL 0

#else

#define NULL ((void *)0)

#endif

2、原因

因为c++中不能将void *类型指针隐式转换成其他类型的指针类型,为了解决空指针的问题,所以引入了0来表示空指针。

但是在使用的过程中会出现问题,如:

有两个重载函数:

1、void function( type1 a, type2 *b);

2、void function( type1 a, int i);

当我们使用NULL的时候,因为NULL是0,所以会调用第二个函数,但我们实际上用的是空指针因此我们会做强制转换成

function(a, static_cast(NULL))、function(a, static_cast(0))让代码能够运行。

如上面所示如果两个函数同时存在的时候,我们能够发现有错误而会修改,

但是如果只存在1,而在自己重载的时候会在调用的时候,使用NULL,会出现错误,

而在检察的时候写的是NULL,并不容易检察出来需要强制转换。

因此在大多数c++的书籍当中会推荐使用0作为空指针。

3、nullptr

在没有c++11的时候我们可以自己实现一个《Imperfect c++》上面有一个实现

const

class nullptr_t

{
public:
template
inline operator T*() const
{ return 0; }

template
inline operator T C::*() const
{ return 0; }
private:
void operator&() const;
} nullptr = {};

目前vs2010支持nullptr

你可能感兴趣的:(程序编程总结)