C++构造函数的调用顺序
http://blog.163.com/hbu_lijian/blog/static/[***********]16617/
1、如果类里面有成员类,成员类的构造函数优先被调用;
2、创建派生类的对象,基类的构造函数函数优先被调用(也优先于派生类里的成员类);
3、 基类构造函数如果有多个基类则构造函数的调用顺序是某类在类派生表中出现的顺序而不是它们在成员初始化表中的顺序;
4、成员类对象构造函数如果有多个成员类对象则构造函数的调用顺序是对象在类中被声明的顺序而不是它们出现在成员初始化表中的顺序;
5、派生类构造函数,作为一般规则派生类构造函数应该不能直接向一个基类数据成员赋值而是把值传递给适当的基类构造函数否则两个类的实现变成紧耦合的(tightly coupled)将更加难于正确地修改或扩展基类的实现。(基类设计者的责任是提供一组适当的基类构造函数)
#include
class A;
class B;
class A
{
private:
public:
A()
{
std::cout
}
};
class B
{
private:
public:
B()
{
std::cout
}
};
class C:public B
{
private:
A a;
public:
C()
{
std::cout
}
};
int main(int argc, char *argv[])
{
C c;
std::cout
return 0;
}
输出结果:
B()
A()
C()
更改程序如下:
#include
class A;
class B;
class C;
class A
{
private:
public:
A(C &pC)
{
std::cout
}
};
class B
{
private:
public:
B(void *pB)
{
std::cout
}
};
class C:public B
{
private:
A a;
public:
C():B(this),a(*this)
{
std::cout
}
};
int main(int argc, char *argv[])
{
C c;
std::cout
return 0;
}
运行结果:
B()
A()
C()