c++ 缺少一些输出结果

标签 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?感谢任何帮助。

最佳答案

B 也有两个类型为 A 的数据成员,以及这些对象的析构函数(首先是 m_am_x second, in reverse declaration order) 在 B 的析构函数之后调用。

所以这里发生的事情是:

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

关于c++ 缺少一些输出结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16523474/

相关文章:

php - 如何在 PHP 和 C++ 之间建立通信?

c++ - 测试函数是虚函数还是构造函数

c++ - 琐碎的析构函数会导致别名吗

c++ - 什么时候调用析构函数?

c++ - 基类与扩展类关联时无匹配函数错误

C++ 中间函数 Hook : get register values and jump back [x86 assembly on windows]

c++ - 父类的父类中的虚函数

c++ - 这个for循环的条件怎么还满足呢?

c++ - 使用默认构造函数返回临时对象时,析构函数调用两次

c++ - 为数组中的每个对象调用析构函数