不按顺序的初始化可能引起warning~
http://fafeng.blogbus.com/logs/17747724.html
C++构造函数调用顺序
1. 如果类里面有成员类,成员类的构造函数优先被调用;
2. 创建派生类的对象,基类的构造函数优先被调用(也优先于派生类里的成员类);
3. 基类构造函数如果有多个基类,则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序;
4. 成员类对象构造函数如果有多个成员类对象,则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序;
5. 派生类构造函数,作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递给适当的基类构造函数,否则两个类的实现变成紧耦合的(tightly coupled)将更加难于正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)
#include <iostream> #include <string> class A{ public:A{…} ~A{…} } class B{ public:B{…} ~B{…} } class D{ public:D{…} ~D{…} } class E{ public:E{…} ~E{…} } class C :public A,public B{ public:C{…} private:D objD_; E objE_; ~C{…} } int main(void){ C test; return 0; } |
运行结果是
A{…}//派生表中的顺序 B{…} D{…}//成员类的构造函数优先被调用 E{…} C{…} ~C{…} ~E{…} ~D{…} ~B{…} ~A{…} |