C++中对象的构造顺序与动作

构造函数在干什么?

不管有没有继承与成员对象,永远都是先调用本类的构造函数的。

只是在构造函数内部,执行第一个有效语句之前,会先调用基类的构造函数,再调用成员对象的构造函数,最后再执行本类构造函数内部的语句。

而构造函数内部做得事情包含(通常的实现是按这个顺序的):

  1. 初始化this指针。 2. 调用基类构造函数。 3. 初始化虚表指针(虚表是编译是建立的,虚表指针需要在构造时赋值)。 4. 调用成员对象的构造函数。 5. 执行构造函数内的语句。

需要注意的是,初始化虚表指针的时机在C++标准里是没有明确的规定的,所以 3 可能会被编译器实现放到 5 的后面。

由于这个原因C++标准明确规定了,在构造函数内,不允许发生多态的行为,也就是说如果有虚函数,必须要调用当前构造函数类的那个虚函数(即在基类构造函数中会调用基类的函数,在子类构造函数中会调用子类的函数)。



blog comments powered by Disqus

Published

16 June 2012

Category

c_cpp