如何进阶学习C++?最佳方法是什么?

12

对于一个被称为中级 C++ 程序员的人,你有什么建议可以帮助他进入下一阶段的 C++ 编程?

中级程序员:相当熟悉 ISO C++,能够通过一些运气读取和修改别人的代码,熟练掌握数据结构和算法,但并不出色。

  1. 学习 C++0x
  2. 了解不同构造类型生成的汇编代码种类,可能为 x86
  3. 忘记语言细节,掌握基础——从类似 Sipser 或 Papadimitriou 的地方学习自动机理论
  4. 如果您知道 OOP 或至少认为自己知道,考虑如何将函数式编程技能与 C++ 结合起来
  5. 开发类似于 LLVM 或 GNU Toolchain 的编译器和开源软件
  6. 整个想法都是错误的——下一阶段意味着更复杂的数据结构。因此,如果您熟悉 AVL,请考虑学习左倾红黑树等其他数据结构

显然,没有人能在这个列表中做到所有的事情,因此我们需要一些关于最佳前进方式的建议。

注意:感谢大家提供的非常有用的回复。


5
我真的不知道你所说的“下一级”是什么意思 - 除非你描述一下你现在处于什么“级别”,否则你的问题是毫无意义的。 - anon
@Neil 我已经提供了我对中级程序员的定义,但这是相当主观的,我理解这一点。非常感谢您的反馈。 - Fanatic23
3
附加问题:当您达到“C++”掌握的“终极最后一级别”时,您拥有什么特殊能力? - ereOn
11
没有人知道。一旦你达到了 C++ 最高水平的掌握,你将蜕变成为一个由原始能量组成的升华存在,与宇宙融为一体。 - John Feminella
4
当你达到了C++掌握的终极境界后,你会转向Haskell。 - Philipp
如果你认为你理解了C++,那么你并没有真正理解C++(这只是一个引语的改编,请不要太认真:P) - Cogwheel
12个回答

14

我认为你可以完成列表上的所有事情,但不要一次性做完。至少在我看来,你的想法有些反过来了。学习C++(或其他任何语言)是达到目标的手段,而不是目标本身。

当需要实现某些目标时,应该在必要时学习更高级的语言技术、更高级的数据结构等。当然,你肯定需要一个合理的起点才能做更多的事情,但除了相对专业化的一小组基础知识之外,大多数高级技术、数据结构等也是相对专业化的。

与其为了学习而学习,不如写一些代码。当某些东西看起来笨拙、难以处理、不灵活等时,寻找更好的方法来处理它。这样,你不仅会学习更高级的技术、数据结构等,还会了解它们的真正作用,因此你会有一个相当不错的想法,知道何时、如何和为什么使用它(同样重要的是,至少有一些其限制和何时可能不适用或无用的想法)。


TopCoder.com 的练习室是一个很好的方式,如果你此刻没有特别灵感的话,可以写许多代码。 - Cogwheel
1
@Coghweel:非常正确。Project Euler和Sphere Online Judge也有一些有趣的问题。 - Jerry Coffin
有很多网站可以供你练习编写代码。请参见http://stackoverflow.com/questions/662283/websites-like-projecteuler-net - Dubs
但有时仅通过搜索特定解决方案来学习并不能产生相同的效果。例如,有很多C++范例存在,但除非您已经知道它,否则您将无法找到所需的范例。 - Tomer Vromen

10

回答你的具体问题:

学习C++0x

你绝对需要这样做。所以可能你已经得到了你的答案...

学习不同构造类型生成的汇编代码,也许是针对x86

我会说学习如何理解编译器生成的汇编语言,至少要有个大概的了解。但你肯定不应该试图预测编译器会做什么。

忘记语言细节,掌握基础知识——从Sipser或Papadimitriou等地方学习自动机理论

如果这能激发你的兴趣,我想也可以...

如果你懂面向对象编程,或者至少认为你懂,考虑如何将函数式编程技能与C++结合起来

在所有C++支持的范式中,函数式编程可能是最差支持的——如果你想学习FP,学Haskell(或其他语言),而不是C++。

开发类似于编译器和开源项目LLVM或GNU Toolchain的东西

GNU是用C写的,所以不太可能提高你的C++技能——我对LLVM知之甚少。

整个想法都是不正确的 - 下一级意味着更复杂的数据结构。所以如果您了解AVL,请考虑学习左倾红黑树等其他技术。
红黑树并不比AVL树更复杂 - 基本概念相同。如果您理解了数据结构教科书中涵盖的基本结构,则我认为没有必要深入挖掘,除非该主题特别吸引您。

8

我想了解BOOST

你可以逐步开始使用它,随着你深入了解库,你会思考“它是如何工作的?”。

  • 使用它将使您成为更有生产力和更好的C++程序员!
  • 理解它的工作原理将使您获得“大师”徽章!!
  • 贡献和扩展它将确保您永垂不朽!!!

3
如果您已经掌握了基本的语言:
那么按照以下顺序(尽管有些时候需要回溯):
- 学习、研究并理解RAII - 找出如何在C上下文中使用RAII,这样你就永远不会被C代码卡住。 - 理解异常以及异常保证是什么。
- 找出如何实现方法,使得每个不同类型的保证都得以满足。 - 学习标准容器。
- 学习每种容器所需求的要求。 - 学习迭代器。
- 学习迭代器特征以及它们如何与指针一起工作。 - 学习算法库 - 学习流库
- 回去学习流和迭代器如何工作 - 学习函数指针以及它们在算法中的使用
- 弄清楚functor是什么以及如何使用它。 - 学习绑定(bind)并查看boost bind - 学习boost容器以及它们与标准容器的差异。 - 学习智能指针。
- 不同类型是什么,以及何时有效地使用每一种。 - 开始阅读关于boost中其他可用内容的资料。
到此为止,您就可以开始学习如何使用C++了。

1

学习汇编语言(例如编写汇编)可能是个好主意,但我强烈建议你不要沉迷于编译器生成的细节,因为这些细节会随着版本和优化级别的变化而改变。


1

我会强烈支持第四点。学习函数式编程非常有价值。虽然我在C++中没有做过太多的函数式编程,所以我不知道它是否很自然地适合,但我喜欢Ruby和Scala如何进行函数式编程。


这对于C++来说不太合适,但这并不意味着学习FP不能让你成为更好的C++程序员。学习任何不同的编程范式都会让你成为一个更好的程序员。 - David Thornley

1

我建议你进入编程的设计部分。学习如何设计,编写良好的代码,学习良好的编程实践。设计模式、UML、单元测试都属于这里。

由于人们很少一直做同样的事情,我也建议像你说的那样学习汇编语言。学习汇编语言很有趣,它真正让你更好地理解计算机。没有什么比知道计算机在最低层级别上是如何工作的感觉更好了。

掌握低级和高级编程的知识胜过其他任何东西。


问题是关于C ++的...我认为至少将C ++和FP这样不同的东西混合在一起是一种不好的品味。 - user204724

1
不要太担心C++0x现在... 确保你真的真的真的理解基础知识先。这意味着确保你理解引用、指针、左值、右值、模板、继承、内存管理等等。我不仅是说对这些有一个基本的理解,我是说真正地了解C++内存模型和每个表达式的含义。
我真的很喜欢#4和#6。关于#6,请尝试在C++中编写一些非常高级的数据结构。没有什么比尝试解决一些高级数据结构所涉及的问题更能让你更快地学习这门语言了。

1

学习其他人如何优雅地解决困难问题。非常重要的是:只有实践,不要忘记评估。让别人审查你的代码或解决问题的方法。

是的(指第4点),学习其他编程语言,特别是那些比C++具有特定优势的语言,而不是直接将它们的技术应用于C++。专注于找到自己编写尽可能少出错的代码的方法,找到一种校准的系统化和抽象化方法,可以始终应用于问题解决和实现。

收集/构建一组工具/库和编码实践,使您能够停止发明轮子,但以最佳方式处理所有最常见的任务。因为如果您考虑一下,除了错误、可读性、可扩展性和可扩展性以及较小程度的性能外,如果您编写完成工作的代码,您实际上已经证明了自己是一个好的程序员。

我在这里追求的是生产力。如果您更喜欢理论,那么您也可以只关注一些小片段和晦涩的语言特性。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接