第三章:构造函数,析构函数和赋值操作(Effective C++ Second Edition 读书笔记)

来源:互联网 发布:怎么判断usb2.0端口 编辑:程序博客网 时间:2024/05/16 04:42

类的构造函数,析构函数,赋值函数,拷贝函数需要特别注意,因为这几个操作常常隐藏在日常变量操作中。


重点:为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符(条款11)

1) 要写自己版本的拷贝构造函数和赋值操作符函数,或者,声明为private成员,而不去定义(实现)它们。这就防止了会有人去调用它们,也防止了编译器去生成它们。
2) 采用某种引用计数机制去跟踪当前有多少个对象指向某个数据结构。

条款12: 尽量使用初始化而不要在构造函数里赋值
评论:通过成员初始化列表来进行初始化总是合法的,比在构造函数体内赋值高效。

条款13: 初始化列表中成员列出的顺序和它们在类中声明的顺序相同
评论:类成员是按照它们在类里被声明的顺序进行初始化的,和它们在成员初始化列表中列出的顺序没一点关系。

条款14: 确定基类有虚析构函数

评论:虚析构函数工作的方式是:最底层的派生类的析构函数最先被调用,然后各个基类的析构函数被调用。


重点:operator=函数使用的几点规范(条款15,16,17)

1)  让operator=返回*this的引用(条款15)

注释:当定义自己的赋值运算符时,必须返回赋值运算符左边参数的引用,*this。如果不这样做,就会导致不能连续赋值,或导致调用时的隐式类型转换不能进行,或两种情况同时发生。

2)  在operator=中对所有数据成员赋值(条款16)

注释:当类里增加新的数据成员时,也要记住更新赋值运算符函数; 继承类得赋值函数里面必须显示调用基类的赋值函数。

3)  在operator=中检查给自己赋值的情况(条款17)

注释1:如果可以在赋值运算符函数体的首部检测到是给自己赋值,就可以立即返回,从而可以节省大量的工作,否则必须去实现整个赋值操作。
注释2:保证正确性。如果一个赋值运算符必须首先释放掉一个对象的资源(去掉旧值),然后根据新值分配新的资源。在自己给自己赋值的情况下,释放旧的资源将是灾难性的,因为在分配新的资源时会需要旧的资源。


注释:处理方法,在operator=函数中增加,*this的判断,如果一致,表明是同一个实例,不需要赋值。

if (*this == rhs)    return *this;


第一章:从C转向C++ (Effective C++ Second Edition 读书笔记)

第二章:内存管理(Effective C++ Second Edition 读书笔记)

第三章:构造函数,析构函数和赋值操作(Effective C++ Second Edition 读书笔记)

第四章 类和函数:设计与声明(Effective C++ Second Edition 读书笔记) 

第五章 类和函数:实现(Effective C++ Second Edition 读书笔记)

第六章 继承和面向对象设计 (Effective C++ Second Edition 读书笔记)