1. Default Constructor只对base class subobjects和member class objects初始化,对data member不做操作

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

  • 1.包含有带默认构造函数的对象成员的类 .
  • 2.继承自带有默认构造函数的基类的类 .
  • 3.有虚函数的类(需要初始化每一个class object的vptr) .
  • 4.有一个虚基类的类

本文主要针对"包含有带默认构造函数的对象成员的类"

 class Foo {public:Foo() { cout << "Foo Constructor" << endl; } Foo(int) { }};void test_defaultConstructor(){cout << "begin" << endl;Bar bar;cout << "end" << endl;}

(1). 若无定义构造函数

class Bar {  private: Foo foo;
};

编译器的对类Bar的Default Constructor为

Bar::Bar(){foo.Foo::Foo();//调用Foo的构造函数来初始化foo对象
}

运行测试代码,输出结果为:
begin
Foo Constructor
end

(2). 若有构造函数

Bar::Bar()
{cout << "Bar default code" << endl;
}

此时编译器扩展已知构造函数:

Bar::Bar(){foo.Foo::Foo();//调用Foo的构造函数来初始化foo对象cout << "Bar default code" << endl;
}

运行测试代码,输出结果为:
begin
Foo Constructor
Bar default code
end

(3). 若有多个class member objects都要求constructor初始化,将按照在classs中的声明次序调用

 class Dopey {public:Dopey() {cout << "Dopey Constructor" << endl;}};class Sneezy {public:Sneezy() {cout << "Sneezy Constructor" << endl;}};class Bashful {public:Bashful() {cout << "Bashful Constructor" << endl;}};class Snow_White { private:Dopey dopey;Sneezy sneezy;Bashful bashful;int mumble; };void test_defaultConstructor(){cout << "begin" << endl;Snow_White obj;cout << "end" << endl;}

运行测试代码,输出结果为:
begin
Dopey Constructor
Sneezy Constructor
Bashful Constructor
end

(4). 如果基类有默认构造函数,又有一个成员有默认构造函数,那么顺序是谁先呢?

 class SnowWhite : public Dopey{ private: Sneezy sneezy; };void test_defaultConstructor_ObjectOrder(){cout << "begin" << endl;SnowWhite obj;cout << "end" << endl;}

运行测试代码,输出结果为:
begin
Dopey Constructor
Sneezy Constructor
end

【引用】
[1]<<深度探索C++ 对象模型 Inside The C++ Object Model >> Stanley B.Lippman 候捷 译
[2] 代码地址 https://github.com/thefistlei/cplusStudy.git

深度探索C++ 对象模型(3)-默认构造函数Default Constructor相关推荐

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

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

  2. 《深度探索C++对象模型》--2 构造函数语意学

    1.default constructor的构造操作 C++standard:对于class X,如果没有任何user-declared constructor,那么会有一个default const ...

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

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

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

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

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

    没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...

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

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

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

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

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

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

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

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

最新文章

  1. 这三类问题是工控系统最大的威胁
  2. 用C语言扩展Python的功能的实例
  3. matlab摄像头录像保存在哪里,matlab连接摄像头读取视频部分解释
  4. linux配置本地yum源 centos7.9为例
  5. 为什么要用dubbo,dubbo和zookeeper关系
  6. java springMVC生成二维码
  7. 网站通过了QQ安全认证了
  8. java 使用 com.thoughtworks.xstream.XStream 将map转为xml
  9. 中秋福利!开源基础设施峰会9折票!另有限量免费门票!
  10. ansys linux17.2 字体,ubuntu16.04安装Ansys17.2教程,及遇到的问题(安装非完美)
  11. 使用jxbrowser在Swing中嵌入网页Web页面
  12. Python爬虫,4567电影网电影信息爬取,二级页面处理方案
  13. opta球员大数据预测胜负_大数据预测简介及使用流程
  14. M1芯片处理器mac能用的AI(llustrator CC 2021 直装版M1优化版)解决M1版MAC安装AI闪退问题 完美支持M1芯片处理器
  15. 华为手机在线将语音转换文字的办公黑科技便签,轻松提高你的工作效率
  16. 迅雷高速下载免安装 Kali Linux
  17. 2021.5.9(cf)
  18. ebay站点码类型 SiteCodeType(令牌) 各个国家的网址,日本 德国等等
  19. SQL注入-Day17
  20. 机器视觉学习笔记--图像滤波1

热门文章

  1. centos linux编译c,紧急提醒!Linux是如何编译C语言程序文件的?CentOS 8的gcc使用方法介绍...
  2. cdh 安装_使用Cloudera的CDH部署Hadoop:第三步,安装管理平台和数据库
  3. bi导入数据失败 power_会商业智能BI的人,做的报表都比别人好看
  4. linux 普通用户crond,linux下普通用户的定时任务
  5. 网传B站数据中心起火?所谓“现场图片”却是盗来的
  6. Google全球三大数据中心自然冷却方案剖析
  7. SLAM:SLAM之VSLAM的简介
  8. DL之HNN:基于HNN(subplot)将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字
  9. Crawler:反爬虫机制之基于urllib库+伪装浏览器+代理访问(代理地址随机选取)+实现下载某网址上所有的图片到指定文件夹
  10. 初等数论四大基本定理