【C++学习之路】组合类的构造函数
1 #include <iostream>
using namespace std;
class A
{
public:
A(){ cout << "调用A无参" << endl; }
A(int a){ dataA = a; cout << "调用A有参" << endl; }
A(double a){ dataA = a; cout << "调用A有参2" << endl; }
private:
int dataA;
};
class B
{
public:
B();
B(int, int, int);
B(int);
B(int, int);
B(double);
private:
A a1, a2;
int dataB;
};
B::B(){ cout << "调用B无参" << endl; }
B::B(int a, int b, int c) :a2(a), a1(b) { dataB = c; cout << "调用B有参1" << endl; }
B::B(int a){ dataB = a; cout << "调用B有参2" << endl; }
B::B(int a, int b) :a2(a),dataB(b) { cout << "调用B有参3" << endl; }
B::B(double a) : a2(a){ cout << "调用B有参4" << endl; }
void main()
{
B b1;
B b2(, , );
B b3();
B b4(, );
B b5(7.0);
}
代码分析:
1.可以发现,在创建组合类的对象的时候,构造函数的调用顺序为:(1)按内嵌对象在组合类内的声明顺序先后调用 相应对象的相应的类的构造函数(不是初始化列表的顺序) (2)执行该组合类的相应构造函数(函数体)
2.在内嵌对象的初始化列表中如果没有写明对象的初始化列表,系统会自动生成一个无参构造函数,这时如果在该内嵌对象对应的类中没有定义(注意,不是没有显式声明,有时系统会自动生成默认的构造函数,这当然也是一种无参构造函数)无参构造函数,系统会报错
B::B(int a, int b) :a2(a),dataB(b) { cout << "调用B有参3" << endl; }
比如这条语句,a1的初始化列表没有显式表示,这时系统会调一个a1对应的无参构造函数,而实际的调用顺序应该是这样的:
B::B(int a, int b) :a1(),a2(a),dataB(b) { cout << "调用B有参3" << endl; }
3.这条语句:
B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "调用B有参1" << endl; }
B::B(int a, int b, int c) :a2(a), a1(b) { dataB = c; cout << "调用B有参1" << endl; }
B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "调用B有参1" << endl; }
B();
B(int, int, int);
B(int);
B(int, int);
B(double);
B::B(){ cout << "调用B无参" << endl; }
B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "调用B有参1" << endl; }
B::B(int a){ dataB = a; cout << "调用B有参2" << endl; }
B::B(int a, int b) : a2(a),dataB(b) { cout << "调用B有参3" << endl; }
B::B(double a) : a2(a){ cout << "调用B有参4" << endl; }
【C++学习之路】组合类的构造函数的更多相关文章
- [原创]java WEB学习笔记57:Struts2学习之路---ActionSupport类的说明
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 《JS权威指南学习总结--9.2 类和构造函数》
内容要点: 例9-1展示了在JS中定义类的其中一种方法.但这种方法并不常用,毕竟它没有定义构造函数,构造函数是用来初始化新创建的对象的. 使用关键字new来调用构造函数会自动创建一个新对象,因此构造函 ...
- java学习之路--String类的基本方法
String类常见的功能 获取 1.1 字符串中包含的字符数,也就是获取字符串的长度:int length(); 1.2 根据位置获取某个位置上的字符:char charAt(int index) 1 ...
- Unity学习之路——主要类
学习https://blog.csdn.net/VRunSoftYanlz/article/details/78881752 1.Component类gameObject:组件附加的游戏对象.组件总是 ...
- 【C++学习之路】派生类的构造函数(二)
二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( ...
- [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 【C++学习之路】派生类的构造函数(三)
三.多层继承的派生类 1.多层继承的派生类只需在构造函数的初始化列表中写出直接基类的构造函数即可 class student { public: student(int n, string nam) ...
- 【C++学习之路】派生类的构造函数(一)
一.简单派生类的构造函数 1.所谓简单派生类,就是指派生类中不包含基类的内嵌对象的派生类. 2.一般来说,这样的派生类的构造函数的形式是: student( int i, string nam, in ...
- C++学习之路—继承与派生(二):派生类的构造函数与析构函数
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...
随机推荐
- Java版将EXCEL表数据导入到数据库中
1.采用第三方控件JXL实现 try { //实例化一个工作簿对象 Workbook workBook=Workbook.getWorkbook(new File("F://qzlx.xls ...
- C++ Primer 随笔 Chapter 13 复制控制
1.复制控制包含的内容:复制构造函数.赋值操作符.析构函数 2.复制构造函数: a. 定义:只有单个形参,而且该形参是对本类类型的引用,这样的构造函数被成为复制构造函数 b. 适用情况: (1)根据一 ...
- Poetize6: Acting Cute
3042: Acting Cute Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 59 Solved: 36[Submit][Status] Des ...
- HNOI 2016 省队集训日记
第一天 DeepDarkFantasy 从东京出发,不久便到一处驿站,写道:日暮里. ——鲁迅<藤野先生> 定义一个置换的平方为对1~n的序列做两次该置换得到的序列.已知一个置换的平方, ...
- hihoCoder 1389 Sewage Treatment 【二分+网络流+优化】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2016)网络赛)
#1389 : Sewage Treatment 时间限制:2000ms 单点时限:2000ms 内存限制:256MB 描述 After years of suffering, people coul ...
- [Locked] Binary Tree Vertical Order Traversal
Binary Tree Vertical Order Traversal Given a binary tree, return the vertical order traversal of its ...
- angularJS 过滤器 表单验证
过滤器1.filter的作用就是接收一个输入,通过某个规则进行处理,然后返回处理后的结果,主要用于数据的格式化.2.内置过滤器(1)Currency(货币)将一个数值格式化为货币格式,默认为$(2)D ...
- 20个高级Java面试题
这是一个高级Java面试系列题中的第一部分.这一部分论述了可变参数,断言,垃圾回收,初始化器,令牌化,日期,日历等等Java核心问题. 程序员面试指南:https://www.youtube.com/ ...
- Linux 上Oracle RAC 10g 升级到 Oracle RAC 11g
了解如何在 Oracle Enterprise Linux 5 上逐步将 Oracle RAC 10g 第 2 版升级到 Oracle RAC 11g. Oracle 数据库 11g(即,新一代网格计 ...
- XMPPFrameWork IOS 开发(一)xmpp简介
原始地址:XMPPFrameWork IOS 开发(一) XMPP : The Extensible Messaging and Presence Protocol 中文全称: 可扩展通讯和表示协议 ...
