构造函数调用顺序及初始化列表
2018-01-31 09:18
169 查看
设有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的构造函数,并为其传入了一
4000
个参数9,于是进入B的构造函数
② 进入B的构造函数,发现其初始化列表并没有显示调用父类构造函数,但其有父类A,于是进入A的构造函数
③ 进入A的构造函数,发现其没有父类,于是执行A的构造函数
④ 返回B的构造函数,开始执行,根据传入的值9,为其成员变量m_kB赋值为9
⑤ 返回C的构造函数,开始执行,将其成员变量m_kC赋值为0
结束。
即: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的构造函数,并为其传入了一
4000
个参数9,于是进入B的构造函数
② 进入B的构造函数,发现其初始化列表并没有显示调用父类构造函数,但其有父类A,于是进入A的构造函数
③ 进入A的构造函数,发现其没有父类,于是执行A的构造函数
④ 返回B的构造函数,开始执行,根据传入的值9,为其成员变量m_kB赋值为9
⑤ 返回C的构造函数,开始执行,将其成员变量m_kC赋值为0
结束。
相关文章推荐
- C++ 多继承构造函数初始化列表调用顺序
- 构造函数、初始化列表的调用顺序
- java 构造函数 成员函数初始化顺序 以及多态的构造函数的调用顺序
- asp.net 页面从初始化到卸载事件顺序(及对页面控件调用)完整列表【转】
- java初始化构造函数调用顺序
- 构造函数初始化列表中成员列出顺序要和它们在类中声明顺序相同
- 静态构造函数, 静态成员初始化/调用顺序
- 构造函数初始化列表执行顺序
- 成员变量的初始化顺序与变量在类型中的申明顺序相同,而与它们在构造函数的初始化列表中的顺序无关
- 多个类中包含子对象时(构造函数,析构函数,初始化列表顺序)
- java初始化构造函数调用顺序
- 在构造函数的参数化列表中调用基类构造函数初始化继承来的成员变量
- C++类的构造函数列表成员初始化的顺序问题
- java初始化构造函数调用顺序
- java初始化构造函数调用顺序
- asp.net页面从初始化到卸载事件顺序(及对页面控件调用)完整列表
- java初始化构造函数调用顺序
- C++复习14 构造函数初始化调用顺序
- 初始化列表调用子类构造函数
- 类的成员变量 声明顺序 决定 初始化顺序(构造函数初始化列表不影响)