2013-05-13 113 views
1

我发现这个代码在一个C++测试: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?感谢任何帮助。

+0

你使用调试器? – 2013-05-13 13:37:42

回答

5

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

那么,什么是怎么回事是:

  1. 在构建b,其A底座子对象的构造函数首先被调用,这是缺省构造的,因为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. B的构造函数体b被执行(这里没有什么可做的);
  4. 执行B的析构函数,该函数将输出2并递减b.m_i(将变为1);
  5. m_a的析构函数被执行(它首先以反向声明的顺序出现),它将打印5;
  6. 执行m_x的析构函数,打印3;
  7. bA子对象的析构函数被执行,并将打印b.m_i,现在是1
+0

Thanks.Did没有注意到他们的类型是A,只是记住,他们是int。对不起,我的疏忽。 – 2013-05-13 13:45:30

+0

@VitaliK:没问题,我编辑了答案,以详细说明发生了什么 – 2013-05-13 13:50:00

0

当你创建你B项,它会创建2个项目A,用值3和5