2013-01-04 24 views
3

對於C++對象構造函數,明確擁有一個FULL初始化列表有什麼優缺點嗎? (全在你把所有的成員列出,即使我們只是使用默認的構造函數?)在缺省構造函數中顯式設置初始化列表有沒有優缺點?

舉例來說,如果我有對象:

class MyObject 
{ 
    public: 
     MyObject(); 
    private: 
     double _doub; 
     Foo _foo; 
     std::set<int> _intSet; 
     int _int; 
     Bar _bar; 
} 

有從有任何區別我構造函數是:

MyObject::MyObject(): 
    _doub(1.4), _foo("me"), _intSet(), 
    _int(5), _bar() {}; 

與僅列出我特別需要(對或調用非默認的構造函數)設置數據的對象:

MyObject::MyObject(): 
    _doub(1.4), _foo("me"), _int(5) {}; 

如果該類只有它使用默認構造函數的對象,我是否應該設置一個初始化列表?

例如:

​​

是否有一個點有一個構造函數呢?

MyObject::MyObject(): 
    _foo(), _intSet(), _bar() {}; 

謝謝。

+0

關於最後一部分:不是,它的功能與沒有它的功能相同,但是失去了「無用戶定義的構造函數」狀態。 – chris

+0

當只有_value-initialization_時,它才重要 –

+0

避免在標識符中使用前導'_',因爲任何後跟大寫的'_'標識符都是爲編譯器使用而保留的。如果您喜歡'_',請將其放在標識符的末尾。 – Yakk

回答

7

()初始值設定項爲沒有用戶定義的構造函數的對象調用「consructorless」值初始化。因此,對於這些對象,構造函數初始值設定項列表中顯式初始值設定項的存在或不存在會有所不同。

可以使用()初始值設定項(「很高興保持所有項儘可能初始化」)和反對它(「避免無償虛擬初始化」)。

就個人而言,如果行爲與()初始值設定項相同或不相同,我會避免將成員包括到構造函數初始值設定項列表中。而且,如果行爲不同,但對於特定成員我沒有有意義的初始值設定項,我寧願將其保留爲未初始化狀態(而不是調用值初始化)。

+0

使用'()'調用值初始化,特別是在POD類型的數組上,可以很方便,如果你的編譯器支持它(有些像VS 2010一樣,但會說「這還不是標準」,其中當然,是錯誤的,因爲現在它*是*基於標準的,但不是那樣)。 – WhozCraig

0

缺點

class A { 
public: 
    A(); //Where A does not initialize members 
    void initMembers(); //A function that initalizes everything 
    void tellClassBName(); //Writes a line in the console with the name of b1 
private: 
    B b1; 
    int aNumber; 
} 

試想創建A類的一個實例該對象將不得擔任值B1。儘管如此,仍然可以在調用initMembers()之前調用tellClassBName(),這會導致錯誤。

作爲一個團隊工作時,如果沒有良好的文檔,看起來並不好。

相關問題