现代 C++ 编程课程

一门免费提供的“Modern C++”课程面向已经了解 C 的开发者,引发了关于应如何学习 C++、以及先学 C 是否有帮助或反而有害的讨论。评论者将这份材料与其他书籍和课程作比较,争论原始指针与智能指针的角色、嵌入式和内核场景中 STL 与手写代码的取舍,并强调理解编译、构建工具链和内存模型的重要性。许多人指出,C++ 仍然是嵌入式系统、游戏引擎、HPC 和金融等领域的核心语言,但其复杂性、工具链摩擦和教学方式也意味着,要在真实场景中使用它,必须谨慎选择学习资源,往往还需要限制在一个“现代子集”内。

课程的受众与范围

  • 课程面向已经了解 C 和基本面向对象编程的人,不是绝对初学者。
  • 被认为很适合想“升级”的嵌入式 C 开发者,或者想把 C++ 当作“更好的 C”来使用的人。
  • 也有人认为另一个资源(learncpp.com)对初学者更友好、内容更详细。

如何学习 C++(从 C、Java/JS 或从零开始)

  • 关于是否应该先学 C,存在强烈分歧:
    • 一方认为:C++ 是建立在 C 抽象机器之上的,理解 C 和原始指针至关重要。
    • 另一方认为:把 C 的习惯带入 C++ 可能有害;最好直接学 C++,避免糟糕的 C 模式。
  • 对于来自 Java/JS 的人,推荐了若干书籍/视频课程;一些经典 C++ 书籍被批评为并不适合作为教程。
  • 多位发言者认为,C++(以及 Rust)都需要“书本式学习”与实际项目相结合,不像 Python/JS 这类更容易直接上手“可折腾”的语言。

嵌入式与底层 C++

  • 担忧包括:RAM 有限、没有堆、长时间运行系统、分配器复杂性、异常支持以及二进制体积。
  • 常见的嵌入式经验法则:
    • 通常避免 STL、异常、RTTI 和大量动态分配。
    • 使用 C++ 语言特性(RAII、构造函数、模板、constexpr/consteval),但不引入大型库。
    • 在关闭异常时,可以考虑第三方“embedded STL”替代方案。
  • 分享了若干链接和简短教程,内容包括:
    • C++ 对象模型,以及类如何映射到 C。
    • 不依赖标准库的裸机 C++。

现代 C++ 实践与陷阱

  • 很多人认为智能指针和 RAII 应该尽早教授,而不是作为“高级”主题;在新代码中,new/delete 应当很少使用。
  • 关于原始指针的争论:
    • 有人认为必须深入学习。
    • 也有人认为应尽量弱化其所有权角色,主要把它们当作可空/非拥有型引用。
  • 有人提醒要注意一些 C 中合法但在 C++ 中未定义的模式(例如类型重解释)。
  • 也有人抱怨语言复杂度(例如整本书都在讲初始化)以及 Unicode/文本处理等不完整领域。

教学风格与材料

  • 对幻灯片式格式的看法不一:
    • 有人喜欢简洁的幻灯片;也有人认为仅靠幻灯片不足以学习。
  • 也有人批评那种“功能清单式”的入门方式:先把所有构造都列出来,却不先展示实际用法。
  • 推荐的做法包括:
    • 将学习与真实项目或开源代码库结合起来。
    • 尽早明确讲解编译模型(翻译单元、模板、LTO)。

工具链与构建系统

  • 希望有容器化开发环境,能同时使用多个编译器和静态分析器。
  • 有人认为容器化说明 C++ 工具链不够“现代”;但也有人在 Rust/Python 中同样使用容器来做隔离。
  • Meson 和 CMake(通常配合 Ninja)是主要推荐的构建系统;C++ 的依赖管理普遍被认为很痛苦。
  • 讨论还提到使用 devcontainers 或 Nix 来控制工具链和库的可见性。

C++ 在行业与就业市场中的地位

  • C++ 仍然广泛用于:
    • 编译器、操作系统内核、浏览器、数据库、HPC、图形学、机器人、交易/HFT,以及游戏引擎。
  • 对就业环境的看法:
    • 岗位比 Web/Python 少,但通常更“算法味”更强。
    • 在交易/HFT 中提到薪资很高;游戏行业平均;嵌入式相对较低。
  • 如果目标是“更高级别”的工作,有人建议扩展到 Python、C#,或者项目管理。
  • Rust 经常被提及为有吸引力的替代方案,但 C++ 被认为已经根深蒂固,尤其是在游戏和系统领域。