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. bzoj3744

    这道题是目前我做bzoj最感动的一题没有之一……首先先警示一下,分块的题目能不套主席树尽量不套因为主席树不仅回答来一个log而且常数也比较大,对于分块这种根号的算法非常不适合这里是求区间逆序对,考虑查 ...

  2. 安装配置MongoDB

    1.下载mongodb https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.6.8.tgz 2.解压 tar zxf mongodb-lin ...

  3. github继续折腾

    又在折腾github了,本来以前在neworiginou这个github上上传过项目的: 现在想在另一个github上joely上传项目,发现按以前的流程做个测试,居然没能上传成功! 经发现,以前的n ...

  4. Spfa费用流模板

    ; ,maxm=; ,fir[maxn],nxt[maxm],to[maxm]; int cap[maxm],val[maxm],dis[maxn],path[maxn]; void add(int ...

  5. 【动态规划】Vijos P1143 三取方格数(NOIP2000提高组)

    题目链接: https://vijos.org/p/1143 题目大意: NxN的矩阵,每个值只能取一次,从(1,1)走到(n,n)走三次能取得的最大值. 题目思路: [动态规划] f[x1][y1] ...

  6. Nightmare(搜索)

    http://acm.hdu.edu.cn/showproblem.php?pid=1072 /* 题意: 迷宫内有入口和出口 在6分钟结束后炸弹会爆炸,但是迷宫内有重置炸弹的装置,可以重置炸弹的时间 ...

  7. hdu 4619 二分图最大匹配 ——最大独立集

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4619 #include <cstdio> #include <cmath> # ...

  8. zoj 3462

    #include <cstdio> #include <cmath> #include <algorithm> #include <iostream> ...

  9. selenium grid 测试资料

    像风一样自由的4篇博客: http://blog.csdn.net/five3/article/details/9671287 http://blog.csdn.net/five3/article/d ...

  10. Java GC CMS 日志分析

    https://blogs.oracle.com/poonam/entry/understanding_cms_gc_logs 笔者对其中某几条记录又进行了详细说明,以下是一条完整的CMS日志记录的示 ...