C++中为什么要尽可能使用0而不是NULL
来源:互联网 发布:巴丁算法集 编辑:程序博客网 时间:2024/05/22 07:45
首先呢,要明白一点儿,NULL是一个无类型的东西,而且是一个宏。而宏这个东西,从C++诞生开始,就是C++之父嗤之以鼻的东西,他推崇尽量避免宏。而在他的FAQ中,也有相应的一个关于NULL与0的解释,也谈到了这一点儿。Stroustrup: C++ Style and Technique 在C++标准中,我们可以见到一个词语叫做null pointer constant,其实在C++11标准前,是只承认0为null pointer constant的。所以,在C++中,我们也经常能听到一个说法,就是赋予null pointer,应该是使用0,而非NULL。而nullptr pointer constant这个词语在C++11发布后,终于再添了一个成员,就是nullptr。而与NULL本质不同的是,nullptr是有类型的(放了在stddef头文件中),类型是 typdef decltype(nullptr) nullptr_t; 而正是因为是有类型的,这给我们编译器实现nullptr的时候带来了更多细节的考虑,当然也给了使用者更多的保障,所以如果你的编译器支持nullptr,请一定使用nullptr!而nullptr的出现背景,其实是很简单的,C++哲学上来说就是C++之父一直对null pointer没有一个正式的表示感到非常不满,而更工程的来说,就是关于重载这个问题。void f(void*){}void f(int){}int main(){ f(0); // what function will be called?}而引入了nullptr,这个问题就得到了真正解决,会很顺利的调到void f(void*)这个版本。好了,真的以为nullptr就这样了么? 我前面说过了nullptr是有类型的,叫做nullptr_t,这给我们编译器实现带来了诸多要考虑的东西,不幸的话让我们来举点儿奇葩例子吧!union U{ long i; nullptr_t t;};int main(){ U u; u.i = 3; printf("%ld\n",(long)u.t); // What it is? 0 or 3?}那么这是应该符合union语意还是nullptr的语意呢?这在标准中是没有说的,我们也为此争论了非常久。当然在我们编译器的实现还是保持了nullptr的语意,结果是0。而nullptr有类型后,还能做什么呢?那当然就是可以捕获异常了。int main(){ try { throw nullptr; } catch(nullptr_t) { } }你扔一个NULL试试?看他应该用什么收,正是因为没有类型,所以就要用它的本质类型,比如long什么的来说。你扔一个0试试?那就也不是所谓的空指针类型了,就是要用int什么的来收了。所以,推崇nullptr是有道理的,我们在编译器实现nullptr的时候考虑了非常非常多的细节,还有很多你们可能一直用不到的情况,我们都要用来测试,目的就是保障开发者的使用。再次那句话,如果你的编译器支持nullptr,请一定使用nullptr!最后再扯一点儿,0在C++是很神奇的东西。比如纯虚函数为什么是用=0来设置的,不知道有没有同学去考虑过这个问题没有。如果你深刻理解了C++哲学,这应该就是非常简答的问题了。学语言嘛,一定要学到其哲学,你才能知道其之美,其之威力,尤其是C++。
0 0
- C++中为什么要尽可能使用0而不是NULL
- 在JavaScript中,为什么要尽可能使用局部变量?
- 为什么我们要尽可能使用Iterator接口中的remove方法而不是用Collection接口中的remove方法
- 为什么Android开发使用Java而不是C++?
- 【C++】尽可能使用const
- NSString 为什么要使用copy,而不是retain?
- JDBC为什么要使用PreparedStatement而不是Statement
- JDBC为什么要使用PreparedStatement而不是Statement
- JDBC为什么要使用PreparedStatement而不是Statement
- 为什么要使用SLF4J而不是Log4J
- 为什么要使用SLF4J而不是Log4J
- 为什么要使用事件而不是委托变量?
- 为什么要使用SLF4J而不是Log4J
- JDBC为什么要使用PreparedStatement而不是Statement
- JDBC为什么要使用PreparedStatement而不是Statement
- JDBC为什么要使用PreparedStatement而不是Statement
- JDBC为什么要使用PreparedStatement而不是Statement
- 为什么要使用SLF4J而不是Log4J
- HTML Iframe窗口在页面跳转
- poj---1064
- CodeForces 658A Bear and Reverse Radewoosh
- 使用phpstudy本地搭建织梦网站教程
- js 键盘事件
- C++中为什么要尽可能使用0而不是NULL
- 数组编译时出错error C2057: expected constant expression,以及解决办法
- springBoot集成mybatis
- ubuntu安装
- 查看硬盘UUID
- 非接触CPU卡外部认证步骤
- 数据库有数据,但查询不到
- 判断一个二叉树是不是合法的二分查找树
- 字体过长时,缩略并用省略号显示