2016-02-25 77 views
-2
#include <iostream> 
using namespace std; 

class A 
{ 
    int x; 
public: 
    A() { cout << "A's constructor called " << endl; } 
}; 

class B 
{ 
    static A a; 
public: 
    B() { cout << "B's constructor called " << endl; } 
    static A getA() { return a; } 
}; 

A B::a; // definition of a 

int main() 
{ 
    B b1, b2, b3; 
    A a = b1.getA(); 

    return 0; 
} 

輸出:
A的構造函數稱爲
B的構造方法中調用
B的構造方法中調用
B的構造方法中調用爲什麼在包含類的構造函數之前調用靜態成員的構造函數?

我無法理解我們是如何得出上述輸出以及如何對象申報第二堂課上一堂課。

+0

爲什麼你認爲輸出是錯誤的? – drescherjm

+2

類「B」中的'A'靜態聲明導致調用第一個構造函數。編譯器會在調用'main'之前發出代碼來初始化全局變量和* static *變量。 –

+4

如果你用調試器遍歷你的代碼,它應該變得很清楚爲什麼它的行爲如此。 '靜態A a;'是一個靜態對象,將爲'B'的所有實例實例化一次。 –

回答

2

我不能理解我們如何得到上面的輸出以及第二類中第一類聲明的對象。

static A a; 

class B靜態成員,將被用於B所有實例一次實例化。

出現這種情況是進入main()甚至之前,你是幸運的,

cout << "A's constructor called " << endl; 

運作良好,因爲static情況下,不能保證在特定的順序進行初始化(注意std::cout只是另一個static對象實例)。

+0

「'靜態'實例不保證以特定順序初始化」 - 這不太正確,請參閱[這裏](http://stackoverflow.com/questions/1421671/when-are-static-c-類成員初始化),但我理解你的陳述的精神。 「在同一個翻譯單元中定義的對象(通常意味着.cpp文件)按其定義(而不是聲明)的順序進行初始化」 –

相關問題