c++11 真的给人带来了好多惊喜

C++11真的给人带来了好多惊喜。从NULL到nullptr,空指针的这个“改名”,就好比一场革命。想象一下,我们每天都在写代码,以前都习惯用0来表示空指针。C++11出现之后,事情就变得不一样了。0这个数字终于回归到数学本身的含义了,不再背负空指针的责任。nullptr这个名字就像是给空指针颁发了一张新的身份证。 先说说NULL这个东西。你可能以为它只是一个普通的定义,其实它是C和C++之间的一个“双面间谍”。在C语言里,它被定义成(void *)0;而在C++里呢,它就是简单的0。这就导致了一个问题,同一个NULL既可以当作整数用,也可以当作指针用。编译器有时候会“脸盲”,不知道到底该怎么处理。这种情况会导致一些意想不到的错误。 我来给你举个例子。比如有一个函数重载的场景,一个版本是接受int类型参数的,另一个版本是接受void类型参数的。这个时候如果传入NULL,编译器就会陷入尴尬境地:到底选哪个版本呢?结果就是报错了。 这个时候nullptr就派上用场了。它把0从整数和指针这两个身份里解放出来,让它专门负责整数的工作。现在不管函数重载还是其他情况,编译器看到nullptr就知道这是一个指针常量,不会再有二义性了。 为什么一定要用nullptr呢?原因有很多:首先语义清晰了很多;然后模板友好了很多;还有写法安全也提高了很多。 再看看之前三种空指针的写法:如果用NULL或者直接用0都还是可以的,但相对比较老派或者不够直观。现在标准做法就是用nullptr来表示空指针。 为什么要取名叫nullptr而不是null_ptr呢?其实这也是为了和数学常量保持一致。因为宏定义已经过时了,C++之父Stroustrup希望给空指针一个更正式的名字。以前之所以用NULL是因为那时候标准还不成熟,宏是唯一能跨语言的工具。现在标准已经成熟了,大家都应该拥抱nullptr了。 另外关于空指针的一些特性:必须有自己的名字(保留关键字),禁止参与算术运算(不能和整数直接相加),只能转成指针类型(不能转成数组、函数等),任意两个空指针必须相等等等。这些特性在C++17草案里已经部分采纳了。 总之,使用nullptr不仅让代码更清晰易懂,还能减少很多麻烦和错误。Bjarne Stroustrup(C++之父)也认可这种做法。而且这样做还能让维护成本下降30%以上呢!大家都应该试着把代码里的NULL替换成nullptr吧!