条款9:决不再构造和析构过程中调用virtual函数,包括通过函数间接调用virtual函数。
应用:想在一个继承体系中,一个derived class被创建时,某个调用(例如生成相应的日志log)会有相对应的实现。
原因: base class的构造函数会先被调用,而在base class 构造期间virtual函数绝不会下降到dedrived class阶层。事实上,C++的其它部分(dynamic_cast & typeid),在此期间也是一样的把对象视为base class。
 
解决办法:籍由”令derived class 将必要的构造信息向上(通过函数参数)传递至base class的构造函数“。可以在dedrived class中定义一个private static函数来得到该构造信息, 定义为static是为了避免使用尚未初始化好的dedrived class 成员。
 
条款10、11: 令assignment操作符返回一个reference to *this。同时注意在operator=中处理”自我复制“!
说明:operator=要考虑”自我复制安全性“和”异常安全性“。涉及的技术包括:比较”来源对象“和”目标对象“的地址、精心周到的语句顺序、以及copy-and-swap技术。
   1: class A

   2: {

   3:     ...

   4: private:

   5:     int *p;            

   6: }

   7: //1 各种不安全

   8: A& A::operator=(const A& rhs)

   9: {

  10:     delete p;

  11:     p = new A(*rhs.p);

  12:     return *this;

  13: }

  14:  

  15: //2 语句顺序的改变,带来“自我复制安全”(虽然也许不够高效)与“异常安全”。

  16: A& A::operator=(const A& rhs)

  17: {

  18:     pOrig = p;

  19:     p = new A(*rhs.p);

  20:     delete pOrig;

  21:     return *this;

  22: }

  23:  

  24: //3 copy-and-swap技术

  25: void A::swap(A& rhs)

  26: {

  27:     ...//交换*this与rhs

  28: }

  29: A& A::operator=(const A& rhs)

  30: {

  31:     A temp(rhs);

  32:     swap(rhs);

  33:     return *this;

  34: }

  35:  

  36: //4 巧妙伶俐的利用值传递在制造临时副本,即使有可能更为高效(在“函数参数构造”)却牺牲了清晰性。

  37: A& A::operator=(const A rhs)

  38: {

  39:     swap(rhs);

  40:     return *this;

  41: }

 
条款12:复制对象时勿忘其每一个成分
备注:不要尝试以某个copying函数来实现另一个copying函数(copy构造函数,operator=函数)。

Effective C++学习笔记——构造/析构/拷贝运算的更多相关文章

  1. C++学习笔记 构造&析构 友元 new&delete

    构造&析构函数 构造函数 定义:与类同名,可以有参可以无参,主要功能用于在类的对象创建时定义初始化的状态,无返回值,也不能用void修饰,构造函数不能被直接调用,必须通过new运算符在创建对象 ...

  2. 《Effective C++》第2章 构造/析构/赋值运算(1)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  3. 《Effective C++》第2章 构造/析构/赋值运算(2)-读书笔记

    章节回顾: <Effective C++>第1章 让自己习惯C++-读书笔记 <Effective C++>第2章 构造/析构/赋值运算(1)-读书笔记 <Effecti ...

  4. Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value

    Effective STL 学习笔记 Item 38 : Design functor classes for pass-by-value */--> div.org-src-container ...

  5. Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据

    Effective STL 学习笔记 Item 34: 了解哪些算法希望输入有序数据 */--> div.org-src-container { font-size: 85%; font-fam ...

  6. Effective STL 学习笔记: Item 22 ~ 24

    Effective STL 学习笔记: Item 22 ~ 24 */--> div.org-src-container { font-size: 85%; font-family: monos ...

  7. Effective STL 学习笔记:19 ~ 20

    Effective STL 学习笔记:19 ~ 20 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

  8. Effective C++学习笔记(Part Two:Item 5-12)

     近期最终把effectvie C++细致的阅读了一边,非常惊叹C++的威力与魅力.近期会把近期的读书心得与读书笔记记于此.必备查找使用,假设总结有什么不当之处,欢迎批评指正: 如今仅仅列出框架. ...

  9. Effective STL 学习笔记 39 ~ 41

    Effective STL 学习笔记 39 ~ 41 */--> div.org-src-container { font-size: 85%; font-family: monospace; ...

随机推荐

  1. CSS的“层叠”规则的总结

    当你随机打开一个页面,查看源代码,你会发现,同一个元素,不止有一个CSS选择器及对应的样式.而一个元素只能应用一个样式,那么一堆样式中究竟是应用哪一个呢?这就涉及到CSS的层叠规则了.下面就来总结下C ...

  2. 轻量级的数据交换语言(JSON)

    游戏开发过程中,很多用到JSON的地方:客户端与服务端的网络通信,程序读取客户端的数值表之类的. JSON用于描述数据结构,有以下形式存在. 对象(object):一个对象以“{”开始,并以“}”结束 ...

  3. 解决ie6里png图片透明变白色bug

    加入这段js就行了. function correctPNG() // correctly handle PNG transparency in Win IE 5.5 & 6. { var a ...

  4. mysql数据类型整理

    mysql 中数据类型主要有三种 文本.数字 ,日期/时间 文本类型:char 定长,varchar变长,都是最多65535,char多了会截取,varchar少了自动补长.text最多65535,b ...

  5. php中如何输出当前服务器的(中国)当前时间

    date_default_timezone_set('PRC');//PRC是什么?PRC是中华人民共和国啊-_- echo "今天是".date("Y年m月d日&quo ...

  6. CSS3 Gradient-CSS3渐变

    CSS3 Gradient分为linear-gradient(线性渐变)和radial-gradient(径向渐变).而我们今天主要是针对线性渐变来剖析其具体的用法.为了更好的应用CSS3 Gradi ...

  7. 正确的注销PHP SESSION

    /* 1.每个页面都必须开启session_start()后才能在每个页面里面使用session. 2.session_start()初始化session,第一次访问会生成一个唯一会话ID保存在客户端 ...

  8. 什么是JSON对象

    1.什么是json? JSON全称是JavaScript Object Notation,是一种轻量级的数据交换格式.JSON 与XML具有相同的特性,是一种数据存储格式,但是JSON相比XML 更易 ...

  9. eclipse快捷键说明

    Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行  Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt ...

  10. 省去路由器,Windows 7 也能做无线AP

    电脑越来越白菜了,很多朋友家里已经有不少于二台电脑了.比方说一台笔记本一台台试机,哪么上网和联机的问题,随之而来了,二台电脑很多人可能会去买一个路由器,事实上,如果你其中一台有二个网卡一个有线一个无线 ...