2014-10-01 178 views
5

我不知道如果我有我班A*成員,應該不是,我們會自動設置爲nullptr,如果我有我的課的這種形式構造:C++的默認構造函數不會初始化指向nullptr的指針?

class MyCLass 
{ 
    A* m_pointer; 

public: 
    MyCLass() 
    { 
    } 
}; 

不要緊,如果我做MyCLass* o = new MyCLass;或我在C++ 11中做MyCLass* o = new MyCLass();

+3

你能說清楚你的問題嗎? – juanchopanza 2014-10-01 13:09:28

+2

你不需要明確的指針,只需使用'std :: unique_ptr'。 – 0x499602D2 2014-10-01 13:11:15

+5

@ 0x499602D2是什麼讓你認爲這個類應該是指向對象的獨佔所有者? – 2014-10-01 13:15:35

回答

14

指針是 「POD類型」 ...... a.k.a。 「普通舊數據」。對於何時何地,都是缺省初始化的規則總結如下:

Default initialization of POD types in C++

因此,沒有。不管你的類的構造函數是什麼,如果它是作爲類成員的原始指針。你實際上並沒有實例化這個類。因此成員像Foo *std::vector<Foo> *或以*結尾的任何內容都不會初始化爲nullptr。

智能指針類不是POD。所以,如果你使用unique_ptr<Foo>shared_ptr<Foo>是創建類的實例,這確實有一個構造函數,使他們有效地爲空,如果你不初始化它們。

如果我做MyCLass * o = new MyCLass;或者我MyCLass * o = new MyCLass();在C++ 11中?

每個問題

一個問題,請。

Do the parentheses after the type name make a difference with new?

+0

但是,如果我根本沒有定義構造函數,我想它會被編譯器生成的默認CTOR初始化爲'nullptr',對吧? – Narek 2014-10-01 13:20:06

+0

@Narek在這種情況下,你需要'MyClass m {};'或'MyCLass * m = new MyClass();'以確保數據成員如指針是零初始化的,即你需要*初始化*目的。 – juanchopanza 2014-10-01 13:21:30

+0

@Narek Nope。你可以通過搜索來輕鬆閱讀,比如「默認構造函數的確切做法,以及何時調用?」並找到[這個答案]喜歡(http://stackoverflow.com/questions/2417065/does-the-default-constructor-initialize-built-in-types) – HostileFork 2014-10-01 13:21:43

1

默認構造函數,如果編譯器生成或違約,將默認初始化所有成員。任何用戶定義的構造函數都會默認初始化初始化程序列表中沒有顯式初始值設定項的所有成員。

爲默認初始化方法「呼籲類的默認構造函數,保留一切未初始化」。