《Effective C++》是 Scott Meyers 的经典著作,总结了 55 条 C++ 编程核心准则。以下是核心建议的分类整理:
const, enum, inline 替代 #define
constexpr 优于宏常量)。const
const 修饰变量、函数参数、成员函数,明确语义并防止意外修改。std::unique_ptr 管理内存)。non-virtual 函数
try-catch 块或工厂函数封装初始化逻辑。typename 声明依赖类型
typename 显式指明嵌套依赖类型(如 typename T::iterator)。explicit)和返回对象副本。pass-by-reference-to-const 代替 pass-by-value
operator= 返回 *this 的引用
return *this;),以支持链式赋值(a = b = c;)。operator= 中处理自赋值
if (this == &rhs) return *this;,避免自赋值导致资源释放错误。std::shared_ptr、std::lock_guard),依赖析构函数自动释放。= delete)、引用计数(shared_ptr)、深度拷贝或转移所有权(unique_ptr)。get() 方法或重载 operator->/operator* 安全暴露资源(如智能指针)。std::swap 特化)。operator+)若需隐式转换参数,应定义为非成员函数。copy-and-swap 实现强异常安全
swap 无异常地替换原对象(常用于赋值操作符)。inline 的局限
inline 函数需在头文件中定义,过度内联可能导致代码膨胀。using 声明或转交函数(forwarding function)显式暴露基类成员。non-virtual 函数
typename 的双重含义
typename 用于声明嵌套依赖类型(如 typename T::iterator),非依赖类型无需使用。this-> 或 Base<T>:: 显式指明(避免编译器无法识别)。inline 的利弊
inline 可能增加代码膨胀,但能提升性能;避免在构造函数/析构函数中过度内联。lazy evaluation(缓式评估)
ammortized(分期摊还)优化
std::vector 的容量倍增策略)。std::move 和 std::forward 的差异
std::move 无条件转右值,std::forward 条件性保留值类别(用于完美转发)。operator*)若需隐式转换,应声明为友元或非成员函数。traits classes 表现类型信息
std::iterator_traits)。new-handler 的行为
std::set_new_handler),实现分级分配或优雅降级。enum 替代 int)、提供一致性接口、封装资源管理。strict aliasing 规则等。-Wall -Werror)。std::vector 优先于数组)。Boost.SmartPtr, Boost.Asio)避免重复造轮子。这些条款涵盖了 C++ 的核心设计哲学、资源管理、性能优化及工程实践。建议结合实际项目,逐步应用这些准则。如果需要更详细的解释或示例,可以针对具体条款深入讨论!