C++语言导学(原书第2版)(本贾尼·斯特劳斯特鲁普(BjarneStroustrup))

书: https://pan.baidu.com/s/15VfTw9eJ2MoiHktwswP0gw?pwd=tq5x
笔记如下:

一、C++设计哲学

  1. “C++的核心理念:零开销抽象(Zero-overhead Abstraction)——你无需为未使用的特性付出代价。”
  2. “支持多范式编程:过程式、面向对象、泛型、函数式,但需警惕‘瑞士军刀式’滥用。”

二、基础语法与类型系统

  1. auto推导类型时,保留底层const属性,但忽略引用(需显式auto&)。”
  2. nullptr替代NULL0,解决重载函数中指针/整型歧义问题。”

三、面向对象

  1. “构造函数应建立类不变式(Class Invariant),析构函数释放所有资源(RAII)。”
  2. “虚函数(virtual)实现运行时多态,但模板(编译时多态)在性能敏感场景更优。”

四、模板与泛型

  1. “概念(Concepts, C++20)约束模板参数:template<Number T>typename T更清晰安全。”
  2. “可变参数模板(Variadic Templates)支持类型安全的printf式函数,如std::format。”

五、标准库精髓

  1. **“容器选择原则:
    • vector:默认选择,缓存友好;
    • map/set:有序关联;
    • unordered_map:哈希快速查找。”**
  2. std::string_view(C++17)避免不必要的字符串拷贝,但需注意生命周期。”

六、并发与内存模型

  1. std::threadstd::async简化线程管理,但共享数据必须通过mutex或原子变量保护。”
  2. “内存模型(Memory Model)保证多线程中操作的可见性与顺序性std::atomic是关键。”

七、现代C++特性

  1. “移动语义(Move Semantics):std::move将左值转为右值,避免深拷贝(如vector扩容)。”
  2. “结构化绑定(Structured Binding, C++17):auto [x,y] = point;解构元组或结构体。”

八、错误处理

  1. “异常(Exception)应用于不可恢复的错误,而非常规控制流(性能代价高)。”
  2. noexcept声明函数不抛异常,帮助编译器优化(如vector移动操作)。”

九、代码组织

  1. “模块(Modules, C++20)替代头文件(#include),减少编译时间与宏污染。”
  2. “命名空间(namespace)防止符号冲突,内联命名空间(inline namespace)支持ABI兼容。”

十、学习建议

  1. **“掌握C++的层次:
  • 初级:语法与标准库;
  • 中级:RAII、模板、并发;
  • 高级:内存模型、元编程、优化。”**
  1. “C++的复杂性源于其解决现实问题的广度,而非设计缺陷——理解背后取舍是关键。”

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注