构造函数调用顺序及初始化列表

版权声明:本文为博主原创文章,未经博主允许不得用于任何商业用途,转载请注明出处。 https://blog.csdn.net/fyyyr/article/details/79213028

         设有3个类A、B、C,其中A派生B,B派生C。

         即:C-> B -> A

         定义一个C对象,则:

①  进入C对象的构造函数

②  检查C构造函数的初始化列表,看其中是否手动调用基类B构造函数。无论是否手动,都立即调用基类B构造函数。不同的是手动调用时,可以为B构造函数传参

③  进入B构造函数

④  检查B构造函数的初始化列表,看其中是否手动调用基类A构造函数

⑤  进入A构造函数

⑥  检查A构造函数的初始化列表,发现没有手动调用父类构造函数。并且发现A没有父类。于是此时开始执行A的构造函数

⑦  A构造函数执行完毕,返回B构造函数,开始执行B的构造函数

⑧  B构造函数执行完毕,返回C构造函数,开始执行C的构造函数

⑨  C构造函数执行完毕,整个构造过程完毕

         由上可知,调用派生类构造函数时,先进入派生类构造函数,但是并不调用,接着立即进入其父类构造函数,同样并不调用,在进入其父类构造函数……直到根基类没有父类了,那么执行其构造函数,然后层层返回,依次执行子类构造函数。

         即:子类构造函数最先进入,但最后执行

 

         注意②中手动调用父类构造函数时,可以为父类构造函数传参。虽然无论是否手动调用,都是会先调用父类构造函数,但是若要为父类构造函数传参,只能通过初始化列表显式调用并传参。

         如:

         C:C()
         :B(9)
         ,m_kC(0)
         {
         }

         B:B(intbValue)
         :m_kB(bValue)
         {
         }

         执行时:

①  先进入C的构造函数,发现其初始化列表显式调用了B的构造函数,并为其传入了一个参数9,于是进入B的构造函数

②  进入B的构造函数,发现其初始化列表并没有显示调用父类构造函数,但其有父类A,于是进入A的构造函数

③  进入A的构造函数,发现其没有父类,于是执行A的构造函数

④  返回B的构造函数,开始执行,根据传入的值9,为其成员变量m_kB赋值为9

⑤  返回C的构造函数,开始执行,将其成员变量m_kC赋值为0

         结束。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页