Loading

NULL和nullptr的区别

NULL是什么

NULL是C++中的一个挺有意思的常量,在我接触的编译器里,它的定义通常都是0。据说也有编译器会将其定义为((void*)0)

NULL,一般我们都将其解释为空,比如指针没有指向的对象,此时指针的值通常就会被赋为NULL。那其实大多情况下,我们都是更加偏向于认为NULL和指针类型是相关的,而不会把他往int类型上去靠。

但是编译器把NULL解释成0,然后再结合上C++的各种隐式转换,就会有一种很反直觉的行为。
比如void fun(char*)void fun(int),如果我调用fun(NULL),那么实际上编译器会选择调用哪个函数呢?
根据精确匹配,void fun(int)是最精确的,另一个需要一步隐式转换才能得到,所以编译器会调用void fun(int)

指针和整型不存在了(悲

nullptr是什么

C++11针对这个问题,特地引入了一个nullptrnullptr有着自己的确切类型nullptr_t,再也不会被编译器解释为一个整型0了。nullptr能够隐式转换成任何指针类型,并且也能和它们进行比较。
不管怎么说,nullptr在上下文中,总是比NULL更加容易让人理解,且出人意料的行为肯定更少。
以前使用NULL的地方,均可以无缝替换成nullptr,而以后的代码,也请抛弃NULL改为使用nullptr,才更符合modern C++的风格。

posted @ 2023-06-17 21:16  烤肉kr  阅读(106)  评论(0)    收藏  举报