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. 转:Lua简明教程

    需要注意的是:lua中的变量如果没有特殊说明,全是全局变量,那怕是语句块或是函数里. 这里很奇怪,为什么在函数内部声明的变量默认也是global的呢? 函数的返回值 和Go语言一样,可以一条语句上赋多 ...

  2. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoDB才会使用行级锁,否则,InnoDB将使用表锁!

    InnoDB行锁是通过索引上的索引项来实现的,这一点MySQL与Oracle不同,后者是通过在数据中对相应数据行加锁来实现的. InnoDB这种行锁实现特点意味者:只有通过索引条件检索数据,InnoD ...

  3. -_-#【jQuery插件】Colorpicker 颜色选择器

    Spectrum - The No Hassle jQuery Colorpicker (jQuery 插件) Color Picker jQuery plugins (jQuery 插件) colo ...

  4. matlab制造一个64*64的仿真数据

    fid = fopen('test_001.img','w'); r=random('Normal',100,0,64,64); z=random('Uniform',0,5,64,64); %%%% ...

  5. 数学(错排):BZOJ 4517: [Sdoi2016]排列计数

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 693  Solved: 434[Submit][Status ...

  6. Python根据上下限生成不重复随机数

    Python 2.7.5 代码: # coding=gbk import random import sys min_num = input('输入下限:') max_num = input('输入上 ...

  7. 科研论文提交流程与常见问题(EDAS 系统提交)

    第一步 注册文章(Registering your Paper) 如上图,点击菜单中的submit paper按钮,会列出所有的会议和期刊,选择一个你要投稿的期刊或者会议,例如选择第一个2013 IE ...

  8. HDOJ 3466 Proud Merchants

    Problem Description Recently, iSea went to an ancient country. For such a long time, it was the most ...

  9. 重载(Overloading)以及模板(Template)

    继续<C++ premier plus>的学习 (1)函数重载,通俗来说,就是相同的函数名字名下,存在多个函数,要使得这成立,各个同名函数必须形参列表(也称为"签名", ...

  10. DTD与XSD的区别

    DTD=类型定义(Documnet Type Definition) XSD=XML结构定义 ( XML Schemas Definition ) DTD 就相当于 XML 中的“词汇”和“语法”,不 ...