cplusessays - juedaiyuer/researchNote GitHub Wiki

c++杂记

作者:vczh 链接:https://www.zhihu.com/question/19794858/answer/18448868 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

精通C++是一个艰巨的任务。为什么C++比别的语言难学这么多?其实这基本上是因为C++他爹Bjarne Stroustrup说过的一句话“我特别讨厌语言的设计者把自己的喜好强加给用户”(看向go)。结果C++为了不限制你的想法,于是也就变成了现在这个样子——包含若干范式,大概有面向对象(灵活应用virtual继承+shared_ptr可以达到java/C#的效果)模板(这里分两类,分别为type rich programming和meta programming,区别很大)函数式编程(如今有了lambda,配合文件,简直无敌了)过程式但是难能可贵的是,这几种东西在C++混在一起用也是多么的自然。不过,这需要你花时间去掌控他。那到底有没有必要真的学到这个地步呢,我觉得跟你的领域是有关系的。譬如说我,基本上算是人格分裂的,因为:当我搞语言设计和编译器的时候,我总是会倾向于创造各种小DSL来给自己用,用的都是模板(想想boost的spirit大概就明白我的意思了,虽然我不用它),尽量让跟我有同样背景的人一眼能看懂我代码的意思。当我做我那个GUI库(www.gaclib.net)的时候,纯粹是用OO和IoC那一套。当我写3D渲染程序的时候,我会变成一个为了性能不惜牺牲可读性的人。当我是不同的我的时候,我当然只会用C++的一部分来完成我当前的这个任务。这好像是多重标准,但是实际上是由于项目本身的性质而定的。到了这个时候你会觉得,C++真是一门好语言。当你需要为了你的项目放弃不同的部分的时候,C++都能帮你做到。当你需要不同的抽象层次需要不同的性能要求的是,C++还是能够帮你做到。如果你用别的语言,你最终会发现那个语言只能做某几类的项目。这是因为,C++能够自由的让你放弃某些部分,而别的语言会阻止你放弃某些部分。为了达到这个层次,你必须进入一个无限接近于精通C++的状态里,这个时候你才能收放自如,不被C++社区的各种不同的价值观所捆绑。倘若你的项目非常大,不同的部分有不同的特征的时候(什么,一个没有遍布全世界的一两千人写了20年的程序能叫程序吗?),就更加需要你有这种本事了。说到这里,大家大概都明白精通C++大概是个什么感觉了吧——大丈夫能屈能伸。

作者:陈辉 链接:https://www.zhihu.com/question/19794858/answer/14175937 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

谷歌工程师对C++的掌握有两个级别:1. 拥有C++的readability(可读性)认证。通过这个认证需要在实际工作中写出一个比较复杂的完整的类,然后将这个类提交到一个委员会进行审查,委员会会帮你纠正常见的错误,如果你的这个类满足style guide[1]的所有要求,一两个星期之后你就可以拿到可读性认证。一般来说,你需要在实际工作中写过至少几千行代码才能达到这个要求。C++的readability对工程师的意义主要有两个,一个是熟悉并避免C++的缺陷(比如不要使用iostream和exception),另一个是熟悉一些常用的库函数(比如string的各种操作,hash_map和smart pointer的使用等)。通过这个认证之后,工程师就有权利在code review中审阅其他人写的C++程序(注意这个不是readability review)。绝大多数工程师对C++的掌握处在这个水平。2. 顾问级C++程序员。一般需要写过数万行C++代码,用C++实现过比较复杂的系统,熟悉常见的设计模式并在实际工作中应用,对代码重构有丰富经验,最重要的是,成为小组以及周围同事的C++顾问,是同事有C++使用问题时最先想到询问的人。顾问级C++程序员通常是高级工程师(senior engineer)及以上级别,不仅对某种程序语言,对工作中的各种工程问题也经验丰富。其实“精通C++”并不仅仅是熟悉C++本身,你需要对C++需要实现的工程问题和周边问题同样精通;而且“精通C++”这种说法是相对的,如果你能成为组里的C++顾问,能够帮助同事正确使用这种语言有效率地解决工程问题并避免C++的误区,你就算是精通C++的那个人。[1] http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml

作者:空明流转 链接:https://www.zhihu.com/question/19794858/answer/18449427 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

说实话看了楼上各位的回答后,我就不知道说什么好了,该说的都给说完了。按照二楼的说法,我应该是属于“顾问”那一类的C++程序员。(跪如果说熟练使用没有坑就是“精通”,那我想楼上很多人都能做到。但是在这里恐怕我猜楼主是想要个更加炫的答案。按照楼上@vczh 的说法,C++是一个典型的多范式语言,不过他概括的还不够全面。C++是四类范式的组合体:过程式/结构化,面向对象,代表Lambda的模板(元编程),以及作为一个Markov Machine也具有图灵完备性的宏。此外还有一个我不知道怎么归类的type rich programming。在这四类范式之外,还有各种各样的奇技淫巧。这里我说的奇技淫巧,并不是指Boost.MPL或者Loki那样的,那些其实都是C++基本范式中的衍生做法,都是最规矩的。这里的奇技淫巧,给大家举两个例子。比如在C++03时候,还没有explicit type cast operator,那要安全的提供operator bool,还要利用member function pointer的特殊转化规则;又比如BOOST.AUTO在VS2008上利用了一个Bug完成的实现。奇技淫巧的问题在C++11消除了一部分,但是又增加了一些,比如说左值/右值引用的折叠,就是不是一个逻辑上自然的、而是设计后的产物。此外还有一些坑。比如说重载-多态-名称掩藏、虚继承、指针的转来转去导致的问题什么的。这些都还是最最基本的常识性问题。要是应用到生产中,就会变得更复杂。什么时候用继承,什么时候用模板,什么时候用多态,什么时候用宏。好在有一些前辈已经给我们淌了路,比如说Shutter,比如说Meyes。熟读 6E(Effective C++,More Effective C++,Exceptional C++,More Exceptional C++,Exceptional C++ Style,以及Effective STL),这大概是进阶的唯一阶梯。再往上你学C++就没啥用了。多学一学其他语言,例如Haskell,ML,Javascript,C#,自己做一做编译器,了解一些语言设计上的常识,读一些形式化系统的论文,都会帮助你对C++这么一个复杂而丑陋的语言产生更多的同情。当你开始觉得:C++的设计者真可怜;埋怨英文标点实在太少并开始同情BS;决定自己卷起袖子撸一个的时候,大概你就算是精通C++了。当然撸的好,就是Rust;撸的不开心,那就是Go了。

⚠️ **GitHub.com Fallback** ⚠️