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; }
3.1正确的调用顺序:先a1的构造,再a2的构造,最后才是dataB的初始化。
3.2同时这条语句的写法有多种:
A.把组合类的构造放在里面
B::B(int a, int b, int c) :a2(a), a1(b) { dataB = c; cout << "调用B有参1" << endl; }
B.把组合类的构造放在外边,同时不需要考虑dataB的调用顺序,一定是最后调用

B::B(int a, int b, int c) :a2(a),dataB(c), a1(b) { cout << "调用B有参1" << endl; }
4.在类的函数声明的时候,完全可以暂时不写出形参,等到定义的时候再写
声明:
    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++学习之路】组合类的构造函数的更多相关文章

  1. [原创]java WEB学习笔记57:Struts2学习之路---ActionSupport类的说明

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. 《JS权威指南学习总结--9.2 类和构造函数》

    内容要点: 例9-1展示了在JS中定义类的其中一种方法.但这种方法并不常用,毕竟它没有定义构造函数,构造函数是用来初始化新创建的对象的. 使用关键字new来调用构造函数会自动创建一个新对象,因此构造函 ...

  3. java学习之路--String类的基本方法

    String类常见的功能 获取 1.1 字符串中包含的字符数,也就是获取字符串的长度:int length(); 1.2 根据位置获取某个位置上的字符:char charAt(int index) 1 ...

  4. Unity学习之路——主要类

    学习https://blog.csdn.net/VRunSoftYanlz/article/details/78881752 1.Component类gameObject:组件附加的游戏对象.组件总是 ...

  5. 【C++学习之路】派生类的构造函数(二)

    二.有内嵌对象的派生类 1.一般来说,我们会这样定义构造函数 student( int i, string nam, int pid, string pnam, int sid) : person( ...

  6. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. 【C++学习之路】派生类的构造函数(三)

    三.多层继承的派生类 1.多层继承的派生类只需在构造函数的初始化列表中写出直接基类的构造函数即可 class student { public: student(int n, string nam) ...

  8. 【C++学习之路】派生类的构造函数(一)

    一.简单派生类的构造函数 1.所谓简单派生类,就是指派生类中不包含基类的内嵌对象的派生类. 2.一般来说,这样的派生类的构造函数的形式是: student( int i, string nam, in ...

  9. C++学习之路—继承与派生(二):派生类的构造函数与析构函数

    (根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 由于基类的构造函数和析构函数是不能被继承的,所以 ...

随机推荐

  1. OLAP 大表和小表并行hash join

    一个表50MB 一个表10GB 50M表做驱动表,放在PGA里 这时候慢在对对 10g 的全表扫描 对10个G扫描块 需要开并行 我有这样一个算法 一个进程 读 50mb 8进程 来 扫描 10gb ...

  2. Poetize6: Acting Cute

    3042: Acting Cute Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 59  Solved: 36[Submit][Status] Des ...

  3. linux(ubuntu)下分区和格式化sd卡

    我的手机sd卡需要分成两个分区,在windowxp下面死活搞不成.主要的问题是,window只认识sd卡的第一个分区.有人用修改驱动程序,让windows把sd卡认成日立的microdisk,分区和格 ...

  4. Delphi 客户端调用Webservice 的TClientdataset 报出“http://www.borland.com/namespaces/Types-IAppServerSOAP”

    http://www.borland.com/namespaces/Types-IAppServerSOAP 服务器未能识别 HTTP 头 SOAPAction 的值 (2011-04-25 16:4 ...

  5. 什么是左值(what is a lvalue)?

    引用并翻译自<C++ premier plus> 左值是可以通过地址引用的数据对象(data object),例如,变量,数组的元素,结构体的成员,引用变量,以及复引用的指针(defere ...

  6. POJ 3280 Cheapest Palindrome(水题)

    题意:给定一个完全由小写字母组成的字符串s,对每个字母比如x(或a,b,c...z),在字符串中添加或者删除它分别需要花费c1['x']和c2['x']的代价,问将给定字符串变成回文串所需要的最少代价 ...

  7. Virtualization API之libvirt

    The virtualization API 之开源 libvirt探究 By Ruiy: libvirt supports Hypervisors(注,相关的hypervisors项目的权威网站已经 ...

  8. Servlet的接口实现类

    Sun公司提供了两个默认实现类 GenericServlet和HttpServlet HttpServlet指能够处理Http请求的Servlet,它在原有的Servlet基础上添加了与HTTp相关的 ...

  9. artTemplate的使用总结

    原生语法 使用原生语法,需要导入template-native.js文件. 在HTML中定义模板,注意模板的位置,不要放到被渲染区域,防止模板丢失. <script id="main_ ...

  10. 软件设计模式 B卷

            软件设计模式 试 卷(作业考核 线上)  B  卷   学习中心:            院校学号:             姓名                (共        页 ...