首页 / C++ / C++中类的构造函数调用顺序
C++中类的构造函数调用顺序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++中类的构造函数调用顺序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2810字,纯文字阅读大概需要5分钟。
内容图文
当建立一个对象时,首先调用基类的构造函数,然后调用下一个派生类的构造函数,依次类推,直至到达派生类次数最多的派生次数最多的类的构造函数为止。
简而言之,对象是由“底层向上”开始构造的。因为,构造函数一开始构造时,总是
要调用它的基类的构造函数,然后才开始执行其构造函数体,调用直接基类构造函数时,
如果无专门说明,就调用直接基类的默认构造函数。在对象析构时,其顺序正好相反。
下面的这个程序说明这个问题
总结下来,我们必须明确的是当一个类继承与基类,并且自身还包含有其他类的成员对象的时候,
构造函数的调用顺序
为:
调用基类的构造函数->调用成员对象的构造函数->调用自身的构造函数
。
构造函数的调用次序完全不受构造函数初始化列表的表达式中的次序影响,与基类的声明次数和成员对象在函数中的声明次序有关
。
- C++子类和父类的构造函数调用顺序
- #include <iostream>
- using namespace std;
- //子类
- class base
- {
- public:
- base()
- {
- cout<<"i am base constuction!"<<endl;
- }
- };
- //父类
- class drived : public base
- {
- public:
- drived()
- {
- cout<<"i am drived constuction!"<<endl;
- }
- };
- int main()
- {
- drived d;
- //输出结果
- /*
- i am base constuction!
- i am drived constuction!
- Press any key to continue
- */
- return 0;
- }
由输出结果我们可以看到,先调用的是base类的构造函数,再调用了drived类的构造函数,也就是说,在声明子类实例的时候,是会先调用父类的构造函数的。这个很好理解,子类是包含了父类的信息的,所以要构造子类,必须先构造父类的信息,然后加入一些子类的新信息。
- #include <iostream>
- using namespace std;
- class son
- {
- public:
- son()
- {
- cout<<"i am son constuction!"<<endl;
- }
- };
- class family
- {
- public:
- family()
- {
- cout<<"i am family constuction!"<<endl;
- }
- son jack;
- };
- int main()
- {
- family happyfamily;
- //输出结果
- /*
- i am son constuction!
- i am family constuction!
- Press any key to continue
- */
- return 0;
- }
从上面的结果我们科看到,先调用的是构造函数。这是为什么?因为类中含有成员类时,先要给成员类申请空间,先调用成员类的构造函数,然后再调用自身的构造函数。
- #include <iostream>
- using namespace std;
- //父亲姓名
- class name
- {
- public:
- name()
- {
- cout<<"i am name constuction!"<<endl;
- }
- };
- //子类
- class base
- {
- public:
- base()
- {
- cout<<"i am base constuction!"<<endl;
- }
- };
- //父类
- class drived : public base
- {
- public:
- drived()
- {
- cout<<"i am drived constuction!"<<endl;
- }
- name drivedname;
- };
- int main()
- {
- drived d;
- //输出结果
- /*
- i am base constuction!
- i am name constuction!
- i am drived constuction!
- Press any key to continue
- */
- return 0;
- }
上面的例子是声明了一个name类,一个base类,一个drived类,其中drived类是从base类派生,且drived类中声明了name类的一个实例。
- #include <iostream>
- using namespace std;
- //父亲姓名
- class name
- {
- public:
- name()
- {
- cout<<"i am name constuction!"<<endl;
- }
- };
- //子类
- class base
- {
- public:
- base()
- {
- cout<<"i am base constuction!"<<endl;
- }
- name drivedname;
- };
- //父类
- class drived : public base
- {
- public:
- drived()
- {
- cout<<"i am drived constuction!"<<endl;
- }
- };
- int main()
- {
- drived d;
- //输出结果
- /*
- i am name constuction!
- i am base constuction!
- i am drived constuction!
- Press any key to continue
- */
- return 0;
- }
版权声明:本文为【借你一秒】原创文章,转载请标明出处。
原文:http://blog.csdn.net/u013467442/article/details/48682663
内容总结
以上是互联网集市为您收集整理的C++中类的构造函数调用顺序全部内容,希望文章能够帮你解决C++中类的构造函数调用顺序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。