当前位置:  开发笔记 > 编程语言 > 正文

C++ - 成员初始化和增量的顺序

如何解决《C++-成员初始化和增量的顺序》经验,为你挑选了1个好方法。

我正在寻找一些测试来提高我的C++知识.以下是其中一个练习:以下程序的输出是什么?

#include 

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

好吧,我试过这个代码,答案是02002.我来这里有一些解释,因为我不明白为什么会有02002结果.我会解释我的推理,但有些人可以告诉我,我错在哪里吗?

我们将"str"称为要打印的当前字符串.当b对象被建立:

    A调用构造函数.str => 0,m_i=>1

    建设m_a(new A[2]).str =>000

    建设m_x(++m_i).str => 0002,m_i=>3

    str的最后更新(在B's构造函数中)=> str =>00023

这是我的问题:

为什么最终值m_i 2不是3

为什么建造m_x(++m_i)之前完成了m_a(new A[2])?我试图交换m_x和m_a初始化的位置,答案仍然是一样的:02002.

LogicStuff.. 12

为什么最终值m_i 2不是3

因为new A[2]创建了两个与之无关的独立实例*this.m_i所述的b实例仅递增A::AB::B(两次).

如果m_i应该对同一个实例(例如m_i,作为引用)执行增量,则认为最终值m_i应该是更合理的4(数组中有两个对象 - 另外两个增量).

为什么建造m_x(++m_i)之前完成了m_a(new A[2])

因为初始化的顺序取决于数据成员的声明顺序,而不是在成员初始化列表中编写初始化的顺序.



1> LogicStuff..:

为什么最终值m_i 2不是3

因为new A[2]创建了两个与之无关的独立实例*this.m_i所述的b实例仅递增A::AB::B(两次).

如果m_i应该对同一个实例(例如m_i,作为引用)执行增量,则认为最终值m_i应该是更合理的4(数组中有两个对象 - 另外两个增量).

为什么建造m_x(++m_i)之前完成了m_a(new A[2])

因为初始化的顺序取决于数据成员的声明顺序,而不是在成员初始化列表中编写初始化的顺序.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有