c ++缺少一些输出结果

时间:2013-05-13 13:36:15

标签: c++ destructor

我在一个c ++测试中找到了这段代码:

#include <iostream>

class A
{
public:
    A(int n = 2) : m_i(n) { }

    ~A() { std::cout << m_i; }

protected:
    int m_i;
};

class B
    : public A
{
public:
    B(int n) : m_x(m_i + 1) , m_a(n) { }

public:
    ~B()
    {
        std::cout << m_i;
        --m_i;
    }

private:
    A m_x;
    A m_a;
};

int main()
{
    { B b(5); }

    std::cout << std::endl;

    system("PAUSE");

    return 0;
}

答案是:2531。但据我所知,这里只叫了两个析构函数: 首先是B,进入2; 第二个为A,进入1;  我们如何得到5号和3号?感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

B还有两个类型为A的数据成员,并且这些对象的析构函数(m_a第一个,m_x秒,以反向声明顺序)被调用B的析构函数。

所以这里发生的是:

  1. 构造b时,首先调用其A基础子对象的构造函数,这是默认构造的,因为B的构造函数的初始化列表不是为A指定任何参数。这意味着b.m_i将为2;
  2. m_x的{​​{1}}和m_a子对象的构造函数将按声明顺序调用,传递指定的参数。这意味着b将为b.m_x.m_i3),b.m_i + 1将为b.m_a.m_i5);
  3. n的{​​{1}}构造函数的主体被执行(这里没有什么可做的);
  4. 执行了B的析构函数,它将输出b并递减B(将成为2);
  5. 执行b.m_i的析构函数(它首先以反向声明顺序出现),它将打印1;
  6. 执行m_a的析构函数,并打印5;
  7. 执行m_x的{​​{1}}子对象的析构函数,并打印3,现在为b

答案 1 :(得分:0)

当您创建B项时,它会创建2个A项,值为3和5.