首页 » C语言 » 构造函数调用顺序及初始化列表

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

原文 http://blog.csdn.net/fyyyr/article/details/79213028

2018-02-01 02:00:48阅读(564)

         设有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

         结束。

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹