首页 > Note > C++ 构造函数漫谈(三)

C++ 构造函数漫谈(三)

这一章聊一聊在面向对象的C++中,构造函数的调用顺序。

数据成员的构造顺序

一个类的数据成员的初始化顺序只与其在类中的声明顺序相关,与其它无关。

而析构时,如果成员是在堆中,析构顺序正好与构造时相反。

类A的成员的构造顺序为: m1_, m2_, pm1_, pm2_ 。析构时的顺序为 m2_, m1_ ,由于 pm1_, pm2_ 不在堆中,所以它们的析构需要类A自己管理。

 

继承, 多重继承,虚继承中父类的构造顺序

在简单继承中,子类在构造之前总是先调用父类的构造函数,而析构顺序完全相反。
在多重继承中,父类构造的顺序与继承声明的顺序相关,与子类调用无关。

如上代码中,尽管 class E 中我们显式地构造父类,但父类的构造顺序依然是: A, B, D1, B, D2

这里有一个特殊的继承关系:B, D1, D2, E 这种菱形继承,使得对象 D1 和 D2 内都各有一个 B 类子对象,即 类 E 的对象中有一两个 B 类子对象。为防止这种情况我们一般使用 虚继承,使得 E 的对象内只有一个 B类子对象。在有虚继承的多重继承中,虚继承会优先完成构造。

如上代码, 类 B 的构造函数会被最先调用且只会调用一次,然后再其它类按照一般情况完成构造。

 

 

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.