**怎么样才算是精通 C++?
对提问作补充几点:
1. 精通C++的学习路径.比如需要阅读哪些书籍,参与哪类项目,完成何种开发体验.
2. 能力达到何种水平,才算精通?代码经验,项目经验,开发技巧等等.
3. 精通C++的学习成本.诸位大神分享一下,学习曲线,学习过程,以及走过的弯路.
4. 如何高效提升C++水平.**
精通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++大概是个什么感觉了吧——大丈夫能屈能伸。
作者:vczh
链接:https://www.zhihu.com/question/19794858/answer/18448868
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
独立写出一个 C++ 编译器工具链(预处理-前端-后端-标准库)。
这是少数有效的充分条件。
ps. 有鬼佬推出了它的认证:C++ Grandmaster Certification [CPPGM]
说实话看了楼上各位的回答后,我就不知道说什么好了,该说的都给说完了。
按照二楼的说法,我应该是属于“顾问”那一类的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了。
作者:空明流转
链接:https://www.zhihu.com/question/19794858/answer/18449427
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
若干年前,我用C++模板写了个字符串库,可以实现编译期的字符串运算。
很高兴,觉得自己足够精通C++了。Talk is cheap, 刚上传的code 在此 –
xhawk18/type_string · GitHub
直到后来,听说有个叫boost的东西,发现自己写的东西,在boost里面看来,是再基础不过的玩样。迷惘啊,懊悔啊,苍天啊,大地啊,怎么叫人活。。。
再后来,我不在追求精通C++,还是想想怎么将代码转换成生产力吧。
作者:陈厚来
链接:https://www.zhihu.com/question/19794858/answer/35584362
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
曾经用了近八年的C++,自己的Blog也在cppblog上,当时已经达到了不用“run”就能知道有哪些warnings,哪些errors了。。。这算精通吧。。。
四五年没关注,一天翻看一段代码,愣是没看懂,跟人说“这是Java吗?绝不会是C++!”。。。实际那是标准的C++代码,用了C++11标准的代码。。。
现在我都说“C++啊。。会点。。。”
作者:codejie
链接:https://www.zhihu.com/question/19794858/answer/26072679
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
精通就不必强求了,live is too short to program in C++.
学习 C++ 可以经过这么几个阶段。第一是找一本不太「膨胀」的 C++ 教材。基本上掌握 class , overriding, overloading, 最简单的 template (完全不用掌握 partialization )。
第二步是好好阅读《 The Design and Evolution of C++ 》。因为有人说过,一门学科的全部就是它的历史。
接下来你可以学学编译原理,看看高级动态语言,为第四步做准备。
第四步,也就是最最关键的一步。好好看看 C++ FQA (没错,不是 FAQ ,不是 frequently asked question ,而是 frequently questioned answer )。http://yosefk.com/c++fqa/ 这些揭穿了 C++ 设计者从自身角度文过饰非编写的春秋笔法。《 The Design and Evolution of C++ 》解释了 C++ 为什么是一个怪胎,但是它还是一个怪胎。
作者:冯东
链接:https://www.zhihu.com/question/19794858/answer/12985482
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
1, 简历上写着了解c++, 实际上不知道mfc 根 VC有什么区别. 0级
2, 简历上写着精通c++, 但是仅仅知道mfc, 认为VC就是C++的一切。 1级
3, 总是使用malloc,或者 char[100] 来获得内存,但不知道怎么在指定内存上面创建对象。 2级
4, 感觉std::string 没有 CString 好用! 听说过g++ 3级
5, 会使用std::string, 认为 “c/c++” 很不科学,完全就不是一个语言嘛. 知道4种以上c++ compiler. 感觉自己什么都会。 4级
6, 看山是山,看水是水。崇拜boost source code, 呕心沥血的研究经典库的代码. 感觉自己什么都不会。5级
7, 看山不是山,看水不是水。为自己钟情的函数库而奋斗着,恨不得用尽各种tricks 和 traits, 因为各种经典设计模式想得头疼. 稍有走火入魔迹象。 6级
8,看山仍然山,看水仍然是水。 看到每行代码,都是汇编的指令和内存数据的移动。 代码中几乎不出现for 和 while 关键字. 不停地否定自己的过去. 7级
9, 维护着g++,或者Watcom C++ 之类的项目,头发也比较长,有艺术家气质. 8级
10, 参与 C++ Standards Committee, 代表不同的利益集团发言. 9级
11, 彻底走火入魔, 成天幻想修改C++的语法, 添加自己的关键字, 重新实现一个C++的改进, 还想把c++变成脚本,解释执行.已经超越了利益. 10级.
作者:10T交换机
链接:https://www.zhihu.com/question/19794858/answer/35323483
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
简单定义C/C++”精通”本身就很难. 我的感觉是做的时间越久越发现没有所谓什么精通吧, 越做越发现自己根本谈不上知道, 总会有很多东西你闻所未闻…
在北美面试的时候一般总会问这个问题: “你觉得你对C/C++的水平打多少分?” 刚毕业的时候我总是说: 对C我能打9分, 对C++, 怎么也是7-8分.
现在如果再有人问我, 我会说”单纯语言上C我打8分, 如果是在Linux开发C, 我说6分, 原因是在Linux上开发不是简单的了解语言就足够, POSIX, Threading, 所有System APIs, 包括开发Kernel都需要更广泛的知识, 两者不可分”
对于C++, 我只能给自己打6分, 同样的道理, 对于STL或者BOOST我都不敢说”精通”, 又有几人真能精通所有BOOST Libs? 缺点优点, 何时用, 何时不用? 根据产品的不同, 每个项目的侧重点也就不同, 用到的Features也不同, 更何况C++本身也在进化, 新的x0就加入了Threading的Support, 学以致用, 学无止境….
作者:Spike Wang
链接:https://www.zhihu.com/question/19794858/answer/12987921
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
C/C++总共分成四大流派
1.c风格流派
2.面向对象流派
3.模板元流派
4.混合流派
很难全面掌握C++,这个语言一共有18个以上的大的知识点。比其他语言要多出1~2倍,复杂度则要提升到3~4倍。先确定你要用的内容,然后再学习即可。
比较合理的路线是:先从c风格学起,逐渐接触面向对象,再过渡到模板元,最终做到综合使用。
但是,每一种流派都存在自身的优缺点,不存在谁比谁更好的问题。比较著名的程序员中,云峰是c风格的,免费打工仔则是模板元的。
而对于大部分人来说,熟练掌握面向对象已经能够很好的完成工作了。
作者:做游戏的老G
链接:https://www.zhihu.com/question/19794858/answer/16101026
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。