条款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. read和onload jquery.val

    $(document).load(); 当web页面以及其附带的资源文件,如CSS,Scripts,图片等,加载完毕后执行此方法.常用于检测页面(及其附带资源)是否加载完毕. $(document). ...

  2. dp状态压缩-铺砖问题

    题目:有一个n行m列的地板,需要用 1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? 示范: 解法:用F[i][j]存放第i行的第j状态(j为十进制,转为二进制即是状态)有多少种方案. 用 ...

  3. Linux学习之停止进程

    首先,用ps查看进程,方法如下: ps -ef ……smx       1822     1  0 11:38 ?        00:00:49 gnome-terminalsmx       18 ...

  4. php数组排序和分割字符串

    function sortStr($str){ $ary = str_split($str); sort($ary); $len = count($ary); $arr = array(); for( ...

  5. 总结下js中匿名函数的写法~好几天没写博客了。。。

    小哥最近很是心烦啊,不仅仅要继续以现任前端小白,未来前端攻城狮的身份苦逼学习,还要用剩余的时间去完成毕业设计.早知如此,当初我为毛要报考数学这么个苦逼专业....昨天一整天的时间在研究毕设,感觉代码已 ...

  6. javascript不同数据类型的转换

    <script type="text/javascript"> var userEnteredNumber=prompt("Please enter a nu ...

  7. 16.java.lang.InterruptedException

    java.lang.InterruptedException 被中止异常 当某个线程处于长时间的等待.休眠或其他暂停状态,而此时其他的线程通过Thread的interrupt方法终止该线程时抛出该异常 ...

  8. Oracle EBS-SQL (GL-3):从总帐追溯到发票

    SELECT je_header_id, je_line_num, trx_class_name, trx_type_name, trx_number_displayed, trx_date,comm ...

  9. 调试qemu

    最近需要给libvirt增加一个新feature,该feature基于qemu的最新代码. 我需要关心的: http://wiki.qemu.org/Features/Migration 需要自己编译 ...

  10. Cookie、Session

    Cookie.Session Cookie 保存在浏览器端. 4kb 只能保存字符串,还不能是中文. 获取:Request.getCookies(); 设置时间:setMaxAge(); 小于零是浏览 ...