<
Effective C++阅读笔记
>
上一篇

Conemu+MSYS2配置
下一篇

jupyterlab配置

Effective C++笔记

目录

条款

条款2:尽量以const、enum、inline替换#define

条款3:尽可能使用const

const修饰指针时,如果在*的左侧,表示被指物是常量;如果出现在星号右边,说明指针自己是常量;如果在两边,说明被指物和指针自己都是常量。

const方法有两个特性:

  1. 调用此方法时不能改变类的数据成员的值。
  2. 非const实例化对象不能调用const声明的方法。

条款4:确定对象被使用前已先被初始化

条款5:了解C++默默编写并调用哪些函数

编译器自动生成的方法

  1. 拷贝构造函数
  2. 拷贝赋值运算符
  3. 析构函数
  4. 默认构造函数

当拷贝赋值运算是非法时,编译器会拒绝生成:

  1. 引用成员数据。
  2. 常量成员数据。

这样的类不能用于STL容器中,因为容器的元素必须能够拷贝构造和拷贝赋值。

条款6:若不想使用编译器自动生成的函数,就应该明确拒绝

注:如果只是不想使用默认的拷贝构造函数或赋值函数,可以使用C++11提供的=delete特性来删除此函数。

条款7:为多态基类声明virtual析构函数

条款8:别让异常逃离析构函数

条款9:绝不在构造和析构过程中调用virtual函数

条款11:在operator=中处理“自我赋值”

条款13:以对象管理资源

条款14:在资源管理类中小心coping行为

条款16:成对使用new和delete时要采用相同形式

条款17:以独立的语句将new对象置入智能指针

例如:

int priority();
void processWidget(std::tr1::shared_ptr<Widget> pw, int priorty);

processWidget(new Widget, priority());

如果第4行这么调用的话,程序要做以下3件事:

new Widget
priority()
std::tr1::shared_ptr()构造函数

而执行顺序并不能确定(和JAVA、C#不同)。

这时如果先执行了new Widget,再执行priority()时出现异常,这时前面new申请的内存就泄漏了。

所以上述代码应该改为:

std::tr1::shared_ptr<Widget> pw(new Widget);
processWidget(pw, priority());

条款20:宁以pass-by-reference替换pass-by-value

条款25:考虑写出一个不抛异常的swap函数

条款26:尽可能延后变量定义式的出现时间

条款27:尽量少做转型动作

优质的C++代码很少使用强制类型转换。

条款28:避免返回handles指向对象内部成分

条款30:透彻了解inlining的里里外外

inline函数在调用的时候编译器会让它展开,表现出的并不是函数调用的关系。

条款32:确定你的public继承塑模出is-a关系

这里举个例子:例如Bird类和Penguin(企鹅)类。如果Bird类有fly的方法,这时就不能随便使用public继承,会造成语言的不严谨。

如果Bird类有fly方法,则说明此时定义的是一个会飞的鸟类,使用企鹅来继承就不合适。

条款36:绝不重新定义继承而来的non-virtual函数

条款37:绝不重新定义继承而来的缺省参数值

条款42:了解typename的双重意义

template<typename C>
void f(const C& container,  // 不允许使用typename
       typename C::iterator iter)  // 一定要使用typename
Top
Foot