请解释为啥此代码打印 02002 而不是 00022

Posted

技术标签:

【中文标题】请解释为啥此代码打印 02002 而不是 00022【英文标题】: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 不同。 【参考方案1】:

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

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

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

【讨论】:

以上是关于请解释为啥此代码打印 02002 而不是 00022的主要内容,如果未能解决你的问题,请参考以下文章

为啥 2 % 3 = 2 而不是 1? [关闭]

为啥代码打印所有第一个索引?

为啥它在控制台进程中以退出代码 0 结束而不是打印 'sen' 变量这样说? [复制]

为啥打印 char* 会给出字符串而不是地址? [复制]

为啥我的 JSF + Spring Web 应用程序输出 JSF 源代码而不是解释的 HTML 页面?

为啥在这个程序中使用指针而不是常规变量?