1

我在一个 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?感谢任何帮助。

4

2 回答 2

5

B也有两个类型的数据成员A,并且这些对象的析构函数(m_a第一个,m_x第二个,以相反的声明顺序)在 的析构函数之后调用B

所以这里发生的事情是:

  1. 在构造 时,首先调用bA基础子对象的构造函数,这是默认构造的,因为 的构造函数的初始化列表B没有为 指定任何参数A。这意味着b.m_i将是2
  2. m_xm_a子对象的构造函数b将按照声明顺序被调用,并传递指定的参数。这意味着b.m_x.m_i将是3b.m_i + 1),并且b.m_a.m_i将是5n);
  3. Bfor的构造函数的主体b被执行(这里没有什么可做的);
  4. 的析构函数B被执行,它会输出2和递减b.m_i(会变成1);
  5. 的析构函数m_a被执行(它以相反的声明顺序首先出现),它会打印5;
  6. 的析构函数m_x被执行,并被3打印;
  7. b的子对象的析构函数A被执行,并将打印b.m_i,即现在1
于 2013-05-13T13:38:20.593 回答
0

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

于 2013-05-13T13:42:02.730 回答