首页 分享 NULL和nullptr区别

NULL和nullptr区别

来源:花匠小妙招 时间:2024-12-06 18:27

最新推荐文章于 2024-10-06 17:36:36 发布

跟快递小哥飙车 于 2018-09-09 22:55:09 发布

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

NULL来自C语言,一般由宏定义实现,而nullptr则是C++11的新增关键字。在C语言中,NULL被定义为(void*)0,而在C++语言中,NULL则被定义为整数0。编译器一般对其实际定义如下:

#ifdef __cplusplus

#define NULL 0

#else

#define NULL ((void *)0)

#endif

出现C++和C定义不一致的原因是,在C++中不允许(void*)类型进行隐式转换,例如:

char* a =" Hello";

void foo(void* p){}

foo(a);

以上这种调用方式在C++中是不允许的,在C++中指针必须有明确的类型定义。如上需使用foo((char*)a)才可以;但是将NULL定义为0带来的另一个问题是无法与整数的零区分。因为C++中允许有函数重载,所以可以试想如下函数定义情况:

void func(int data);

void func(char* data);

那么在传入NULL参数时,编译器将无法确定到底使用哪个函数定义,造成编译时错误。nullptr在C++11被引入用于解决这一问题,nullptr可以明确区分整型和指针类型,能够根据环境自动转换成相应的指针类型,但不会被转换为任何整型,所以不会造成参数传递错误。nullptr的一种实现方式如下:

const class nullptr_t{

public:

template<class T>  inline operator T*() const{ return 0; }

template<class C, class T> inline operator T C::*() const { return 0; }

private:

void operator&() const;

} nullptr = {};

以上通过模板类和运算符重载的方式来对不同类型的指针进行实例化从而解决了(void*)指针带来参数类型不明的问题,另外由于nullptr是明确的指针类型,所以不会与整形变量相混淆。但nullptr仍然存在一定问题,例如:

void fun(char* p);

void fun(int* p);

在这种情况下存在对不同指针类型的函数重载,此时如果传入nullptr指针则仍然存在无法区分应实际调用哪个函数,这种情况下必须显示的指明参数类型。

相关知识

mysql中null与“空值”的坑
一个等号(=)和三个等号和两个等号的区别(“===”和“==”)
C++字体库开发之freetype vs harfbuzz sfnt表,字体名称,可变轴八
oracle not in (1,3,null)等价于id!=1 and id!=3 and id!=null,NULL与其他值做=或!=比较结果都是UNKNOWN,所以最终没有查出数据
《剑指Offer》之“替换空格”
字符串 (C++/CX)
HarmonyOS应用开发者高级认证,Next版本发布后最新题库
c++ TCHAR转string导致中文缺失或乱码问题及解决
Can‘t get master address from ZooKeeper; znode data == null解决办法
麦冬草和兰花草区别,麦冬草和兰花草区别知识

网址: NULL和nullptr区别 https://www.huajiangbk.com/newsview922927.html

所属分类:花卉
上一篇: 关于梦想的英文句子 因为追求梦想
下一篇: 追求梦想的唯美句子精选

推荐分享