细读 Effective C++

深入 C++ 的诸多设计细节,了解实际场景的最佳实践,以面向对象的方式重新认识 C++。

Item 19:把类的设计视作类型设计

C++ 接口 类型转换 赋值运算符 构造函数 拷贝构造函数

在面向对象语言中,开发者的大部分时间都用在了增强你的类型系统。这意味着你不仅是类的设计者,更是类型设计者。重载函数和运算符、控制内存分配和释放、定义初始化和销毁操作……良好的类型有着自然的语法、直观的语义,以及高效的实现。你在定义类时需要像一个语言设计者一样地小心才行!

Item 25:考虑实现一个不抛异常的swap

C++ STL 异常 模板 特化 作用域 函数重载

提供一个更加高效的,不抛异常的共有成员函数(比如`Widget::swap`)。在你类(或类模板)的同一命名空间下提供非成员函数`swap`,调用你的成员函数。如果你写的是类而不是类模板,请偏特化`std::swap`,同样应当调用你的成员函数。调用时,请首先用`using`使`std::swap`可见,然后直接调用`swap`。

Item 44:将参数无关代码重构到模板外去

C++ 内存 多态 模板

把模板中参数无关的代码重构到模板外便可以有效地控制模板产生的代码膨胀。另外代码膨胀也可以由类型模板参数产生:对于非类型模板参数产生的代码膨胀,用函数参数或数据成员来代替模板参数即可消除冗余;对于类型模板参数产生的代码膨胀,可以让不同实例化的模板类共用同样的二进制表示。

Item 52:写了placement new就要写placement delete

C++ 内存 异常 指针 动态内存 名称隐藏 构造函数

new和delete是要成对的,因为当构造函数抛出异常时用户无法得到对象指针,因而delete的责任在于C++运行时。 运行时需要找到匹配的delete并进行调用。因此当我们编写了"placement new"时,也应当编写对应的"placement delete", 否则会引起内存泄露。在编写自定义new和delete时,还要避免不小心隐藏它们的正常版本。