深度探索C++ 对象模型(3)-默认构造函数Default Constructor
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相关推荐
- 深度探索C++ 对象模型(3)-默认构造函数Default Constructor续
(1)带有虚函数的类 class Widget { public: virtual int flip() = 0;//..}; void flip(const Widget* widget ) { w ...
- 《深度探索C++对象模型》--2 构造函数语意学
1.default constructor的构造操作 C++standard:对于class X,如果没有任何user-declared constructor,那么会有一个default const ...
- 深度探索C++对象模型第2章 构造函数语义学
默认构造函数 两个误区: 1 任何class如果没有定义默认构造函数,就会被合成一个出来:只有在某些情况下被合成 2 编译器合成出来的默认构造函数会明确设定class中每一个数据成员的默认值 :默认值 ...
- 第2章构造函数语义学读书笔记——深度探索c++对象模型
深度探索c++对象模型 第2章 构造函数语义学 2.1 Default Constructor的构建操作 2.2 Copy Constructor的构造操作 2.3 程序转化语义学 2.4 成员的初始 ...
- 深度探索C++ 对象模型(4)-Default Copy Constructor(2)
没有Default Constructor, class Myclass{ public://... private:int a;char *str; }; 编译器执行的是"位逐次拷贝(Bi ...
- 深度探索C++ 对象模型(4)-Default Copy Constructor(4)
编译器层NRV优化(Named Return Value) 原代码为: class testObj{friend testObj foo(double);public:testObj(){memset ...
- 深度探索C++ 对象模型(4)-Default Copy Constructor(3)
程序转化语意学 1. 显式初始化 原代码为: X x0; void foo_bar() { X x1(x0);X x2 = x0; X x3 = X(x0);} 编译器将产生拷贝构造函数,调用拷贝构造 ...
- 深度探索C++ 对象模型(4)-Default Copy Constructor(1)
3种地方出现: 1.明确的调用拷贝构造函数 class X { }; X tmp; X xx=tmp; 2.作为参数时,对临时变量调用拷贝构造函数 void foo(X x); { }; X xx; ...
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到<Inside The C++ Object Model>这本书 ...
最新文章
- 这三类问题是工控系统最大的威胁
- 用C语言扩展Python的功能的实例
- matlab摄像头录像保存在哪里,matlab连接摄像头读取视频部分解释
- linux配置本地yum源 centos7.9为例
- 为什么要用dubbo,dubbo和zookeeper关系
- java springMVC生成二维码
- 网站通过了QQ安全认证了
- java 使用 com.thoughtworks.xstream.XStream 将map转为xml
- 中秋福利!开源基础设施峰会9折票!另有限量免费门票!
- ansys linux17.2 字体,ubuntu16.04安装Ansys17.2教程,及遇到的问题(安装非完美)
- 使用jxbrowser在Swing中嵌入网页Web页面
- Python爬虫,4567电影网电影信息爬取,二级页面处理方案
- opta球员大数据预测胜负_大数据预测简介及使用流程
- M1芯片处理器mac能用的AI(llustrator CC 2021 直装版M1优化版)解决M1版MAC安装AI闪退问题 完美支持M1芯片处理器
- 华为手机在线将语音转换文字的办公黑科技便签,轻松提高你的工作效率
- 迅雷高速下载免安装 Kali Linux
- 2021.5.9(cf)
- ebay站点码类型 SiteCodeType(令牌) 各个国家的网址,日本 德国等等
- SQL注入-Day17
- 机器视觉学习笔记--图像滤波1
热门文章
- centos linux编译c,紧急提醒!Linux是如何编译C语言程序文件的?CentOS 8的gcc使用方法介绍...
- cdh 安装_使用Cloudera的CDH部署Hadoop:第三步,安装管理平台和数据库
- bi导入数据失败 power_会商业智能BI的人,做的报表都比别人好看
- linux 普通用户crond,linux下普通用户的定时任务
- 网传B站数据中心起火?所谓“现场图片”却是盗来的
- Google全球三大数据中心自然冷却方案剖析
- SLAM:SLAM之VSLAM的简介
- DL之HNN:基于HNN(subplot)将凌乱数字矩阵图像(模拟手写数字图片)实现转为最相近的阿拉伯数字
- Crawler:反爬虫机制之基于urllib库+伪装浏览器+代理访问(代理地址随机选取)+实现下载某网址上所有的图片到指定文件夹
- 初等数论四大基本定理