1、创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类);
2、如果类里面有成员类,成员类的构造函数优先被调用;
3、基类构造函数如果有多个基类则构造函数的调用顺序是某类在类派生表中出现的
顺序而不是它们在成员初始化表中的顺序;
4、成员类对象构造函数如果有多个成员类对象则构造函数的调用顺序是对象在类中
被声明的顺序而不是它们出现在成员初始化表中的顺序;
5、派生类构造函数
作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递
给适当的基类构造函数否则两个类的实现变成紧耦合的(tightly coupled)将更加难于
正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)
1.虚基类的构造函数;虚基类构造函数如果有多个,虚基类则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序;
2、创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类);基类构造函数如果有多个,基类则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序;
3、如果类里面有成员类,成员类的构造函数优先被调用;成员类对象构造函数如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序;
4、派生类构造函数
作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递 给适当的基类构造函数否则两个类的实现变成紧耦合的(tightly coupled)将更加难于正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)。
析构函数与构造函数顺序相反,例如
class A
{
public:
A() {TRACE(" construct A\n");}
~A() {TRACE(" destruct A\n");}
};
class B
{
public:
B() {TRACE(" construct B\n");}
~B() {TRACE(" destruct B\n");}
};
class A1 :A
{
public:
A1() {TRACE(" construct A1\n");}
~A1() {TRACE(" destruct A1\n");}
B b;
};
执行
A1* a1 = new A1;
delete a1;
----------------------
result :
construct A
construct B
construct A1
destruct A1
destruct B
destruct A