有三种情况,这将是一个object的内容,以及一class object早期值:

  1. class X { ... };
  2. X x;
  3. X xx = x;               // 情况1,赋值对象
  4. extern void foo( X x);
  5. void bar()
  6. {
  7. X xx;
  8. foo( xx );         // 情况2,作为參数
  9. }
  10. X foo_bar()
  11. {
  12. X xx;
  13. return xx;         // 情况3。作为返回值
  14. }

  Default Memberwise Initalization



            假设class 没有提供一个explicit copy constructor又当怎样?当class object 以 “同样class的还有一个object”作为初值时,其内是以所谓的default memberwise initalization手法完毕的。也就是把每个内建的或派生的data member的值,从某个object拷贝一份到还有一个object身上。

只是它不会拷贝当中的member class object, 而是以递归的方式实行memberwise
initalization.

           

            样例:

  1. class String
  2. {
  3. public:
  4. //..没有explicit copy constructor
  5. private:
  6. char *str;
  7. int   len;
  8. };
  9. class Word
  10. {
  11. public:
  12. //..没有explicit copy constructor
  13. private:
  14. int _occurs;
  15. String _word;  //String object成为class word的一个member. 此处以递归的方式实行memberwise initalization.
  16. // Word 是否合成 copy constructor 取决于 bitwise copy semantics.
  17. //此样例不合成copy constructor 编译器会自己主动复制每个数据成员
  18. };

指出一个错误概念:“假设一个class没有定义copy constructor。编译器就自己主动为它产生出一个”这句话不正确

                正确的概念:Default constructor 和 copy constructor在必要的时候才由编译器产生出来。“必要”意指当class不展现bitwise copy semantics时。



        Bitwise Copy Semantics(位逐次拷贝)



            上例展示了Bitwise copy Semantics.



            有一点非常值得注意:在被合成出来的copy constructor中,如整数、指针、数组等等的nonclass memebers也都会被复制。正如我们所期待的一样。   



        不要Bitwise Copy Semantics

       

            有四种情况不展示Bitwise Copy Semantics, 不展示的时候须要编译器合成copy constructor:



                (1)当class内含一个member object而后者的class声明有一个copy constructor时

                (2)当class继承自一个base class 而后者存在有一个copy constructor时

                (3)当class声明了一个或多个virtual functions时

                (4)当class派生自一个继承串链,当中有一个或多个virtual base classes时



        结论:假设是自己定义复制构造函数时,须要自己把每个数据成员复制;假设是没有自己定义复制构造函数。不管是合成或非合成,编译器都会自己主动复制每个数据成员。复制构造函数的用途是:假设构造函数中存在动态内存分配,则必须定义复制构造函数,否则会出现“指针悬挂问题”。

  1. class A
  2. {
  3. private:
  4. int *p;
  5. public:
  6. A()
  7. {
  8. p = new int(3);
  9. }
  10. };

在这样的情况下,复制对象。会造成两个对象的成员指向同一地址。



        又一次设定Virtual Table的指针

   

            样例:

  1. class ZooAninal
  2. {
  3. public:
  4. ZooAnimal();
  5. virtual ~ZooAnimal();
  6. virtual void animate();
  7. virtual void draw();
  8. };
  9. class Bear : public ZooAnimal()
  10. {
  11. public:
  12. Bear();
  13. void animate();
  14. void draw();
  15. virtual void dance();
  16. };

Bear yogi;

                Bear winnie = yogi;



                把yogi 的vptr值拷贝给winnie的vptr是安全的



               



 



                ZooAnimal franny = yogi; // 这会发生分割行为



               



 



                合成出来的ZooAinmal copy constructor会明白设定object的vptr指向ZooAnimal class的virtual table,而不是直接从右手边的class object中将其vptr现值拷贝过来。

处理Virtual Base Class Subobject

总结:

能够这么觉得,并非在没有自己定义copy constructor的时候编译器就合成一个copy constructor,而是在没有着bitwise copy semantics当将合成 ,在运行default memberwise initialization什么时候。

我没有参加这次行动中copy constructor当运行,此操作不会认为这是在copy constructor当完成。

这是我的这一部分本书的理解。

深入探索C++对象模型-语义的更多相关文章

  1. 拾遗与填坑《深度探索C++对象模型》3.3节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  2. 深度探索C++对象模型

    深度探索C++对象模型 什么是C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各个支持的底层实现机制. 抽象性与实际性之间找出平衡点, 需要知识, 经验以及许多思考. 导读 这本书是C+ ...

  3. 读书笔记《深度探索c++对象模型》 概述

    <深度探索c++对象模型>这本书是我工作一段时间后想更深入了解C++的底层实现知识,如内存布局.模型.内存大小.继承.虚函数表等而阅读的:此外在很多面试或者工作中,对底层的知识的足够了解也 ...

  4. 柔性数组-读《深度探索C++对象模型》有感 (转载)

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  5. 柔性数组-读《深度探索C++对象模型》有感

    最近在看<深度探索C++对象模型>,对于Struct的用法中,发现有一些地方值得我们借鉴的地方,特此和大家分享一下,此间内容包含了网上搜集的一些资料,同时感谢提供这些信息的作者. 原文如下 ...

  6. [读书系列] 深度探索C++对象模型 初读

    2012年底-2014年初这段时间主要用C++做手游开发,时隔3年,重新拿起<深度探索C++对象模型>这本书,感觉生疏了很多,如果按前阵子的生疏度来说,现在不借助Visual Studio ...

  7. 拾遗与填坑《深度探索C++对象模型》3.2节

    <深度探索C++对象模型>是一本好书,该书作者也是<C++ Primer>的作者,一位绝对的C++大师.诚然该书中也有多多少少的错误一直为人所诟病,但这仍然不妨碍称其为一本好书 ...

  8. 《深度探索C++对象模型》读书笔记(一)

    前言 今年中下旬就要找工作了,我计划从现在就开始准备一些面试中会问到的基础知识,包括C++.操作系统.计算机网络.算法和数据结构等.C++就先从这本<深度探索C++对象模型>开始.不同于& ...

  9. C++的黑科技(深入探索C++对象模型)

    周二面了腾讯,之前只投了TST内推,貌似就是TST面试了 其中有一个问题,“如何产生一个不能被继承的类”,这道题我反反复复只想到,将父类的构造函数私有,让子类不能调用,最后归结出一个单例模式,但面试官 ...

随机推荐

  1. 设定十分钟android在状态栏上集成的开源project推荐

    1.前言 于android kitkat 有一个新功能可以设置背景的手机状态栏,让手机风的整个界面格是一致的,它看起来非常酷,在今年的google i/o向上android l这样的风格.来如今看我们 ...

  2. Swift - 自定义函数规则说明

    1,无返回值的函数 1 2 3 func test(name:String){   } 2,返回一个返回值 1 2 3 func test(name:String) -> Bool{     r ...

  3. VMware vSphere服务器虚拟化实验十五 vCenter vShield Manager

    VMware vSphere服务器虚拟化实验十五 vCenter vShield Manager VMware  vShield Manager是专为 VMware vCenter Server 集成 ...

  4. 学习日记之命令模式和Effective C++

    命令模式(Command): 讲一个请求封装为一个对象.从而使你可用不同的请求对客户进行參数化.对请求队列或记录请求日志.以及支持可撤销的操作. 命令模式长处: (1),它能较easy地设计一个命令队 ...

  5. 黑马程序员:Java基础总结----静态代理模式&动态代理

    黑马程序员:Java基础总结 静态代理模式&动态代理   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 静态代理模式 public  class  Ts {   ...

  6. Python编程中常用的12种基础知识总结

    原地址:http://blog.jobbole.com/48541/ Python编程中常用的12种基础知识总结:正则表达式替换,遍历目录方法,列表按列排序.去重,字典排序,字典.列表.字符串互转,时 ...

  7. 日交易41.9亿,B2B的魅力为何不输于B2C、C2C?

        在最近两年的电子商务版图中,B2C和C2C可谓大放异彩,相比之下,B2B却显得颇为“低调”,当然,低调并不代表没有影响力,只不过,相比B2C和C2C面向数亿网民而言,B2B只针对企业和商家服务 ...

  8. Java Swing界面编程(31)---菜单条:JMenu

    package com.beyole.test; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMe ...

  9. 浅谈OCR之Onenote 2010

    原文:浅谈OCR之Onenote 2010 上一次我们讨论了Tesseract OCR引擎的用法,作为一款老牌的OCR引擎,目前已经开源,最新版本3.0中更是加入了中文OCR功能,再加上Google的 ...

  10. hdu1428之spfa+dfs

    漫步校园 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...