2012-12-19 65 views
3

我想了解類的默認構造函數的工作,我不能夠想出這樣的情況:
編譯器生成的默認構造函數的工作 - C++

案例1:

class A 
{ 
    public: 
    int m; 
    string s; 
}; 

然後,我創建這個類的對象:
一個)A a; // Result: compiler initializing m with garbage value
b)A a = A(); // Result : compiler initializing m with garbage value

情況2:現在我除去串s從我的類:

class A 
{ 
    public: 
    int m; 
}; 

一)A a; // Result: when try to access m I get run time error
B)A a = A(); //Result: m is initialized to zero

Q1)爲什麼有差異的情況下,1和2的情況下? Q2)如果我在這兩種情況下向我的班級提供默認構造函數,那麼a)& b)會是相同的?

+2

2.a感覺很奇怪,'m'應該是未初始化的,但不應該給你一個運行時錯誤... –

+0

我同意。不知道爲什麼會出現運行時錯誤。 – paddy

+0

@Matteo Italia:是的,這是問這個問題的主要原因......我不知道爲什麼我得到運行時錯誤。 – JackSparrow

回答

2

案例1:A類是非POD。
案例2:A類是POD。

a) A a; //This is default initialization 
b) A a = A(); // This is value initialization 

案例「1」:m將被初始化爲編譯器生成的默認構造函數一些垃圾值。

情況'2':m將零初始化,因爲A是一個POD。

您不應該在任何場景中發生崩潰。如果你確實使用了破碎的編譯器。

有關默認初始化和值初始化的更多詳細信息,請參閱this link

+0

,這清除了我的懷疑..謝謝..! :-) – JackSparrow

3

因爲在這兩種情況下,整數都是未初始化的。這意味着它的價值是不確定的。它可以是零,或者其他整數可以容納的值。

如果你想給它的默認構造函數初始化爲零,你可以做這樣的:

class A 
{ 
    public: 
    A::A(); 
    int m; 
}; 

A::A() 
    : m(0) 
{} 

注意,您不必提供一個string明確的構造,因爲它是一個類,並有它自己的默認構造函數。

+0

創建對象,如A a = A();它是否保證int會被初始化爲零?(如果我給出了defrtor) – JackSparrow

+1

@Himank:如果'A'是POD,它會(在C++ 03中)確實。看到我的答案。 –

0

class A情況1和情況2之間的唯一區別是,在殼體1的編譯器將sythenize一個non-trivial default constructor因爲sclass A是非原始類型。 但是,在這兩種情況下,m未被初始化。