[英]Order of member variables initialization of the base class in the derived class (constructor)
我是否正确了解初始化在这里的工作方式? 我将说明步骤:
0
,增量m_i = 1
; m_x
在m_a
之前,并且我们u在预递增m_i
。 我们输出 2
然后递增m_i
。 m_a[0]
我们输出 0
然后递增m_i
; 对于m_a [1],我们输出 0
然后递增m_i
。 m_i
为m_a[0]
等于1
个m_i
为m_a[1]
等于1
。 m_i = 2.
输出为:02002
当我们进入基本构造函数的主体时,我真的不明白为什么m_i
的输出等于2? 步骤2之后, m_i
是否等于3
?
#include <iostream>
class A
{
public:
A(int n = 0)
: m_i(n)
{
std::cout << m_i;
++m_i;
}
protected:
int m_i;
};
class B
: public A
{
public:
B(int n = 5) : m_a(new A[2]), m_x(++m_i){ std::cout << m_i; }
~B() { delete [] m_a;}
private:
A m_x;
A *m_a;
};
int main()
{
B b;
std::cout << std::endl;
return 0;
}
在解释问题之前,我先说一下:如果您的对象的初始化非常复杂,以至于需要我将要涉及的详细知识,请修复该问题 。 过于复杂的初始化对任何人都没有好处。
现在,让我们看一下通过调用其默认构造函数构造B
类型的对象时会发生什么。
由于成员初始化器列表中未提及B::A
,因此它将被默认初始化。 这将调用A(int)
,其默认值为0。其结果将是使用值0初始化B::A::m_i
,然后输出该值,然后将B::A::m_i
递增为值1。
现在,我们初始化B
的成员。 要初始化的第一个成员是B::m_x
。 此成员初始化程序读取并递增B::A::m_i
的值,该值是有效初始化的值,恰好在此操作之前为1。 因此,在为B::m_x
调用A(int)
之前, B::A::m_i
取值2。
B::m_x
通过对A(int)
的值2的调用进行初始化。它将该值存储在B::m_x.m_i
,输出该值,并将其递增1。
接下来,我们初始化B::m_a
。 成员初始化器通过调用new A[2]
对其进行初始化,这将默认构造A
2个实例。 这些都与您的问题完全无关,因为它们与B::A::m_i
毫无关系。 但是它确实输出两个零。
初始化B::m_a
,我们输入B
的默认构造函数本身,在那里它仅输出B::A::m_i
的值。 如果您还记得的话,最后设置为2。这就是它的输出。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.