2013-01-23 92 views
4

我有簡單的例子:C++的默認構造函數未能初始化公共變量?

#include <iostream> 

class parent { 
public: 
    int i; 
}; 

class child : public parent { 
public: 
    int d; 
}; 

int main() { 
    child c; 
    std::cout << c.d << std::endl; 
    return 0; 
} 

If you do not explicitly initialize a base class or member that has constructors by calling a constructor, the compiler automatically initializes the base class or member with a default constructor.

但在C(int d;int i;)所有的整數不會被初始化。

enter image description here

有什麼不對呢?或者我沒有看到什麼obvios?

+0

HTTP:/ /stackoverflow.com/questions/563221/is-there-an-implicit-default-constructor-in-c 看看第一個答案的部分默認的構造函數和POD的註釋 – Csq

+1

基本類型don沒有建設者。請參閱http://stackoverflow.com/a/5113385/1801919。 –

+0

您提供的鏈接也適用於Linux編譯器,而不是VS2010 –

回答

3

有上沒有構造類和基本類型做了默認和零初始化之間的差異:

child c1;   // Default initialized. int types are not initialized. 
child c2 = child(); // Zero initialized. int types are in initialized to zero. 
// In C++ 11 
child c3 {};  // Use new syntax for zero initialization 

更詳細的解釋:
這裏:https://stackoverflow.com/a/7546745/14065
這裏:https://stackoverflow.com/a/8280207/14065

4

藉助內置的類型,實際上你自己做初始化:

class parent 
{ 
public: 
    parent() : i() {} 
    int i; 
}; 

這將初始化i0

+1

是標準化還是VC++? – us2012

+4

@ us2012標準C++。 – juanchopanza

+0

這被稱爲_value-initialization_。 – ildjarn

4

內置數據類型(如int)沒有真正初始化。他們的「默認構造函數」什麼也不做,他們沒有默認值。因此,他們只是獲得垃圾價值。如果您希望它們具有特定的值,則必須顯式初始化內置數據類型。

+0

所以例如對於枚舉和所有其他類的簡單數據類型(和複雜),我將不得不做什麼[juanchopanza](http://stackoverflow.com/a/14490503/1056328)建議? – myWallJSON

+0

@myWallJSON:是的。除了'std :: complex'有一個構造函數,它的成員初始化爲零。如果沒有一個構造函數正在初始化某個東西(或者明確指定了某個東西),那麼它將會有一個垃圾值。 – Cornstalks

相關問題