【问题标题】:Please explain why this code prints 02002 and not 00022请解释为什么此代码打印 02002 而不是 00022
【发布时间】:2020-10-31 11:35:23
【问题描述】:

我不明白为什么这段代码会打印 02002 而不是 00022。据我所知,构造函数的顺序是:首先是基类,然后是成员对象(按初始化列表的顺序),然​​后是实际类的构造函数。我在这里有什么问题?

#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;
}

【问题讨论】:

  • 初始化顺序不是根据初始化列表中的顺序。每个new A[2] 中的m_i 彼此不同,并且与作为基础的Am_i 不同。

标签: c++ inheritance constructor


【解决方案1】:

成员变量的初始化顺序始终是声明顺序,而不是构造函数初始化列表顺序。

这意味着B::m_x 将首先被初始化,因为它是在类中首先声明的。

参见例如this initialization order reference了解详情。

【讨论】:

    猜你喜欢
    • 2019-08-02
    • 2014-11-23
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多