什么是C++ 思维

shihyuyao 2013-11-07 11:34:50
常常听到说C++ 高手使用其他语言还是用C++ 思维去写代码

我学C++ 有一阵子可是还是无法体会C++ 思维是什么, 有什么书籍或是文章可以瞭解C++ 思维是什么吗?

或是有什么C++ 经典open source 可以学习

谢谢
...全文
346 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
todd_leftcode 2013-11-11
  • 打赏
  • 举报
回复
RAII、RTTI、异常、多重继承、模板、另外最近C++11的move语义也算吧,比起copy的普通来,这个东西可算另类了。 另外面向对象的基本概念那一套也算了,至少相对于C语言来说。
stereoMatching 2013-11-11
  • 打赏
  • 举报
回复
引用 13 楼 supermegaboy 的回复:
上面各位说的都有比较大的问题,都把代码风格理解成了思维模式。 所谓“C++思维”指的是C++的世界观。在C++看来,世界是多样性的--可从不同角度去描述,是抽象化的,是模式化的,是可扩展的,是可复用的,是通用化的。 理解不到C++的世界观,就只能说在使用C++的语法,而不是使用C++。 明显的例子是,char[N]与string、array与vector,这些东西如何使用,体现出你理解多少“C++思维”。
赞同你的论点,帮你补充一下 c++所谓的多样性体现在multi-paradigms上 c++支援oop, generic programming, TMP,stl,procedural programming等 c++认为没有任何一样paradimg是完美的,所以提供了不同的paradigms让使用者 配合不同的情况使用;与之相对的是java这种单一paradigm的语言--oop最好,oop是神 oop能解决一切,oop就是最终极的解决方法 所谓的精神指的是要了解这些paradigms的优点,缺点,各自的使用时机 更进阶的是如何把不同的paradigms混合共用(例如policy based design) c++之父也说过只是单纯使用c++的语法无法带来什么明显的好处
引用
"Aim to write idiomatic C++: avoid simply writing code in the style of your previous language using C++ syntax; there is little to be gained from simply changing syntax."
TMP由于是被发现而非开发出来的,这部分的支持依然算拙劣的 就像c由于天生就不支援oop,generic programming 所以许多人只能靠刁钻难懂,手法各异的技巧来模拟c++的基础设施 糟糕的是他们这样做只不过是在重复制造c++已经造好的轮子 而且造出来的轮子还比不上c++的好用,安全,简单 更糟糕的是有不少人在制造轮子的过程中很容易就会着迷在 自己的轮子中,并产生一种“我是高手”的错觉 我觉得就算是比较通俗,容易理解和使用的generic programming 在缺乏concepts的支援下也不能说是完整的
threenewbee 2013-11-08
  • 打赏
  • 举报
回复
总之,如果你阅读和编写了大量的代码,你就会体会到这种差异。就好比生活在吴语区的人可以轻易区分出上海话、苏州话、宁波话、无锡话的区别。生活在粤语区的人可以区分广州话、韶关话、香港话、汕头话的区别。而北方人则觉得所有的吴语、粤语都差不多。这完全是一种潜意识。
threenewbee 2013-11-08
  • 打赏
  • 举报
回复
这就好比老外也会说中文,但是欧美的老外的中文具有拉丁语系的发音和语法特点。日本人说的中文则有日本语的发音和词序、语法。 这其实不是“思维”,而是一种长期大量的训练的结果。一个熟练的C++程序员编写的代码风格很接近底层类库源代码的风格,同时他善于使用语言本身的最佳语法编写最简洁高效的代码。比如说,C++拥有模板、多重继承、宏等语法,一个Pascal程序员或者Basic程序员可能会用其它等效的语法语法编写也能使用的程序,但是不能充分发挥C++的语法。 这就好比英文中没有量词,比如 two cars, two prople,一个美国人说的中文可能是一个汽车,两个鸡蛋,三个铅笔,你也能理解,但是不如一个中国人说一辆汽车、两枚鸡蛋、三支铅笔来得地道,就是这个意思。 同样的道理,C++程序员编写Java、Python或者C#程序,也会带有C++的“口音”,比如他们喜欢使用抽象类,而不使用C#特有的委托,他们很少使用Python的动态语法等等,甚至他们喜欢Windows API那种匈牙利命名风格等等。
SKATE11 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
这就好比老外也会说中文,但是欧美的老外的中文具有拉丁语系的发音和语法特点。日本人说的中文则有日本语的发音和词序、语法。 这其实不是“思维”,而是一种长期大量的训练的结果。一个熟练的C++程序员编写的代码风格很接近底层类库源代码的风格,同时他善于使用语言本身的最佳语法编写最简洁高效的代码。比如说,C++拥有模板、多重继承、宏等语法,一个Pascal程序员或者Basic程序员可能会用其它等效的语法语法编写也能使用的程序,但是不能充分发挥C++的语法。 这就好比英文中没有量词,比如 two cars, two prople,一个美国人说的中文可能是一个汽车,两个鸡蛋,三个铅笔,你也能理解,但是不如一个中国人说一辆汽车、两枚鸡蛋、三支铅笔来得地道,就是这个意思。 同样的道理,C++程序员编写Java、Python或者C#程序,也会带有C++的“口音”,比如他们喜欢使用抽象类,而不使用C#特有的委托,他们很少使用Python的动态语法等等,甚至他们喜欢Windows API那种匈牙利命名风格等等。
+++++
赵4老师 2013-11-08
  • 打赏
  • 举报
回复
学任何一种口语,时间长了都会带一些口音的。 使用任何一种开发语言,时间长了都会带有这种语言的思维的。
junlinfushi 2013-11-08
  • 打赏
  • 举报
回复
我不懂LZ想要干什么
Henryinferno 2013-11-08
  • 打赏
  • 举报
回复
原来是所谓的熟能生巧。。。
漫步者、 2013-11-08
  • 打赏
  • 举报
回复
hankcs 2013-11-08
  • 打赏
  • 举报
回复
非高手,凑个热闹 C++自由而严谨,既能面向对象,又能面向内存,只要你技高人胆大,想怎么写都称。 语言入乡随俗吧,现在刚刚开始用Java做大一点的项目,总是更习惯abstract而不是interface。同样的代码在两种语言下有不同的结果:here
秃头披风侠 2013-11-08
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
总之,如果你阅读和编写了大量的代码,你就会体会到这种差异。就好比生活在吴语区的人可以轻易区分出上海话、苏州话、宁波话、无锡话的区别。生活在粤语区的人可以区分广州话、韶关话、香港话、汕头话的区别。而北方人则觉得所有的吴语、粤语都差不多。这完全是一种潜意识。
+1
小塔-皂荚花 2013-11-08
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
这就好比老外也会说中文,但是欧美的老外的中文具有拉丁语系的发音和语法特点。日本人说的中文则有日本语的发音和词序、语法。 这其实不是“思维”,而是一种长期大量的训练的结果。一个熟练的C++程序员编写的代码风格很接近底层类库源代码的风格,同时他善于使用语言本身的最佳语法编写最简洁高效的代码。比如说,C++拥有模板、多重继承、宏等语法,一个Pascal程序员或者Basic程序员可能会用其它等效的语法语法编写也能使用的程序,但是不能充分发挥C++的语法。 这就好比英文中没有量词,比如 two cars, two prople,一个美国人说的中文可能是一个汽车,两个鸡蛋,三个铅笔,你也能理解,但是不如一个中国人说一辆汽车、两枚鸡蛋、三支铅笔来得地道,就是这个意思。 同样的道理,C++程序员编写Java、Python或者C#程序,也会带有C++的“口音”,比如他们喜欢使用抽象类,而不使用C#特有的委托,他们很少使用Python的动态语法等等,甚至他们喜欢Windows API那种匈牙利命名风格等等。
顶!!!!!!!!!!
max_min_ 2013-11-08
  • 打赏
  • 举报
回复
没别的,语言基类下来的一下习惯而已!带了口音比较重而已!
飞天御剑流 2013-11-08
  • 打赏
  • 举报
回复
上面各位说的都有比较大的问题,都把代码风格理解成了思维模式。 所谓“C++思维”指的是C++的世界观。在C++看来,世界是多样性的--可从不同角度去描述,是抽象化的,是模式化的,是可扩展的,是可复用的,是通用化的。 理解不到C++的世界观,就只能说在使用C++的语法,而不是使用C++。 明显的例子是,char[N]与string、array与vector,这些东西如何使用,体现出你理解多少“C++思维”。
Adol1111 2013-11-08
  • 打赏
  • 举报
回复
同意楼上说的。 C++的思维是一种习惯和方法的差异,最主要的还是在语法、库的支持上。写习惯了C++程序的人,转到其他语言后,仍然会用C++的语法模式去写程序,但很多语言都有自己的独特的解决方法,却不会用,有时候还会用C++的眼光来评判这个语言。 比如C语言的标准库缺少太多实用的东西,用C的时候往往会喜欢重复造轮子,而其他语言的人比如C++就喜欢用STL容器、算法,Java也有自己的库,只有必要的时候才会自己动手创造。但现在来说,普通人要想写出比STL高效的容器什么的,已经很困难了,因为你挑战的不是一个人,而是一群算法大师,所以在很多情况下都是C++都会优先使用STL库或其他开源库,而不是自己创造。 这种差异都是因为语言本身的支持、语法的差异等等造成的。要想发挥一个语言的最大优点,就应该放弃之前的语言,去深入理解这个语言的思维模式、习惯。借鉴其他语言当然也可以,但太多了有时候就会显得笨拙。
taodm 2013-11-07
  • 打赏
  • 举报
回复
难道你觉得那是一句好话?称赞的话?
作者 : Scott Meyers 译序、导读 : 侯捷 译序(侯捷) C++ 是一个难学易用的语言! C++ 的难学,不仅在其广博的语法,以及语法背後的语意,以及语意背後的深层思维,以及深层思维背後的物件模型;C++ 的难学,还在於它提供了四种不同(但相辅相成)的程式设计思维模式:procedural-based,object-based,object-oriented,generic paradigm。 世上没有白吃的午餐。又要有效率,又要有弹性,又要前瞻望远,又要回溯相容,又要能治大国,又要能烹小鲜,学习起来当然就不可能太简单。 在如此庞大复杂的机制下,万千使用者前仆後续的动力是:一旦学成,妙用无穷。C++ 相关书籍之多,车载斗量;如天上繁星,如过江之鲫。广博如四库全书者有之(The C++ Programming Language、C++ Primer),深奥如重山复水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),细说历史者有之(The Design and Evolution of C++, Ruminations on C++),独沽一味者有之(Polymorphism in C++, Genericity in C++),独树一帜者有之(Design Patterns,Large Scale C++ Software Design, C++ FAQs),程式库大全有之(The C++ Standard Library),另辟蹊径者有之(Generic Programming and the STL),工程经验之累积亦有之(Effective C++, More Effective C++, Exceptional C++)。 这其中,「工程经验之累积」对已具C++ 相当基础的程式员而言,有著致命的吸引力与立竿见影的帮助。Scott Meyers 的Effective C++ 和More Effective C++ 是此类佼佼,Herb Sutter 的Exceptional C++ 则是後起之秀。 这类书籍的一个共通特色是轻薄短小,并且高密度地纳入作者浸淫於C++/OOP 领域多年而广泛的经验。它们不但开展读者的视野,也为读者提供各种C++/OOP 常见问题或易犯错误的解决模型。某些小范围主题诸如「在base classes 中使用virtual destructor」、「令operator= 传回*this 的reference」,可能在百科型C++ 语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背後的成因、最佳的解法、以及其他可能的牵扯。至於大范围主题,例如smart pointers, reference counting, proxy classes,double dispatching, 基本上已属design patterns 的层级! 这些都是经验的累积和心血的结晶。

64,653

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧