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

2018-02-03 10:19:04来源:网络收集作者:程序诗人人点击

分享

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


         结束。


最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台