没有Default Constructor,

class Myclass{
public://...
private:int a;char *str;
};

编译器执行的是“位逐次拷贝(Bitwise copy semantics)”

Myclass ::Myclass(const Myclass & _my){//合成的伪码this->a = _my.a;this->str = _my.str;
}

编译器构造Default Constructor 只在下面4种case:

  • 1.当class内含一个member object,而后者的class申明中有一个copy constructor(拷贝构造函数)时(无论是被显式的申明还是被编译器合成);
  • 2.当class继承自一个base class而后者存在一个copy constructor时(无论是被显式申明还是编译器合成);
  • 3.当class声明了virtual functions时;
  • 4.当class派生自一个继承串链,其中有一个或多个virtual base classes时.

1. 带有Default Constructor 的member class object

//String 声明了一个explicit copy constructor:
class String {
public:
String(const char* );
String(const String& );
~String();
// ...
};class Word{
public:
Word(int i, String s) : _occurs(i), _word(s) {}
private:   int _occurs; String _word;   //String object称为一个data member
};

那么编译器合成的拷贝构造函数为

inline Word::Word(const Word&wd)
{_word.String::(wd. _word);_occurs =wd. _occurs;//也被复制了
}

如下代码

Word word1(2, "word");
Word word2 = word1;

被优化为:

Word word1(2, "word");
word2._occurs = word1._occurs;
word2._word = word1._word;

2.重新设定Virtual Table的指针

代码如下:

class ZooAnimal {
public:
ZooAnimal();
virtual ~ZooAnimal();
virtual void draw();
};class Bear : public ZooAnimal {
public:  Bear(); virtual ~Bear();   void draw();  void dance();//virtual function
};Bear yogi;
Bear winnie = yogi;
ZooAnimal franny = yogi;

ZooAnimal franny = yogi; 并不会直接将yogi的vptr拷贝给franny的vptr(如果是bitwise copy,则直接拷贝),实际上合成的constructor会显式地设定franny的vptr指向ZooAnimal的vbtl。 (实际上对象被切割)如下图:

3.virtual base class Subobject

class ZooAnimal
{ZooAnimal();virtual ~ZooAnimal();virtual void animate();virtual void draw();
};
class Raccoon:public virtual ZooAnimal
{};
class RedPanda:public Raccoon
{
};Raccoon rocky;
Raccoon little_critter=rocky;Raccoon *ptr;
Raccoon little_critter=*ptr;

不可能在编译期能知道ptr的指向,它既可能是指向Raccoon型变量,也可能指向RedPanda型变量,因此必须在有虚基类的情况下生成一个拷贝构造函数,在其中调整vbcX的位置

【引用】
[1]: <<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译

深度探索C++ 对象模型(4)-Default Copy Constructor(2)相关推荐

  1. 深度探索C++ 对象模型(4)-Default Copy Constructor(4)

    编译器层NRV优化(Named Return Value) 原代码为: class testObj{friend testObj foo(double);public:testObj(){memset ...

  2. 深度探索C++ 对象模型(4)-Default Copy Constructor(3)

    程序转化语意学 1. 显式初始化 原代码为: X x0; void foo_bar() { X x1(x0);X x2 = x0; X x3 = X(x0);} 编译器将产生拷贝构造函数,调用拷贝构造 ...

  3. 深度探索C++ 对象模型(4)-Default Copy Constructor(1)

    3种地方出现: 1.明确的调用拷贝构造函数 class X { }; X tmp; X xx=tmp; 2.作为参数时,对临时变量调用拷贝构造函数 void foo(X x); { }; X xx; ...

  4. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor

    1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作 2. 编译器构造Defau ...

  5. 深度探索C++ 对象模型(3)-默认构造函数Default Constructor续

    (1)带有虚函数的类 class Widget { public: virtual int flip() = 0;//..}; void flip(const Widget* widget ) { w ...

  6. 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

    来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...

  7. 深度探索C++对象模型第2章 构造函数语义学

    默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...

  8. 第2章构造函数语义学读书笔记——深度探索c++对象模型

    深度探索c++对象模型 第2章 构造函数语义学 2.1 Default Constructor的构建操作 2.2 Copy Constructor的构造操作 2.3 程序转化语义学 2.4 成员的初始 ...

  9. 《深度探索C++对象模型》读书笔记第五章:构造析构拷贝语意学

    <深度探索C++对象模型>读书笔记第五章:构造析构拷贝语意学 对于abstract base class(抽象基类),class中的data member应该被初始化,并且只在constr ...

最新文章

  1. 蚂蚁金服 java电话面_蚂蚁金服前端电话面试(一面)
  2. Java中读取某个目录下的所有文件和文件夹
  3. 十二届 - CSU 1803 :2016(同余定理)
  4. 获得最新纪录 sql
  5. Swift学习字符串、数组、字典
  6. 《YOLO算法笔记》(草稿)
  7. 笨办法学 Python · 续 练习 38:SQL 简介
  8. 打车应用上马快递业务靠谱吗?
  9. Java中代码块和继承
  10. cacti监控mysql
  11. c语言函数名称大全,C语言函数大全
  12. 美国诚实签经验——是不是户籍和常住作业地在一起?是不是有居住证?明白居住证信息吗?英语超卓,应变能力强,有幽默感 10分...
  13. AI还原乾隆后妃样貌,延禧攻略众生相。
  14. uoj #185. 【ZJOI2016】小星星
  15. 联想Thinkpad E15 息屏后 无法唤醒
  16. IMAGE WARPING (IDW+RBF)
  17. JAVA设计模式之备忘录模式
  18. 06 体脂率案例优化
  19. SSD202 驱动WIFI-ssw01b的AP模式
  20. 国考计算机及其应用科目,2018国家公务员考试专业科目考试大纲(计算机类)

热门文章

  1. linux复制文件命令cat ,Linux学习之四(复制移动文件命令cp等及查看文本命令cat等)2017-03-28...
  2. matlab计算原点矩,关于用matlab求样本均值方差以及k阶原点矩的matlab程序
  3. mysql 实时聚合分析_mysql滑动聚合/年初至今聚合原理与用法实例分析
  4. mysql5.7rpm安装 force_mysql5.7.27离线安装(基于centos7 ,通过rpm安装)
  5. 数据中心在未来数据管理中的作用
  6. BC:带你温习并解读《腾讯区块链方案白皮书》—区块链的兴起和未来之路
  7. 8.2 TensorFlow实现KNN与TensorFlow中的损失函数,优化函数
  8. 清理 zabbix 历史数据, 缩减 mysql 空间
  9. 在Core WebApi中使用Swagger
  10. 《精通Python设计模式》学习结构型之享元模式