2013-05-13 112 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