在許多文章和書籍中提出了許多C++編程最佳實踐。以下是與C++類數據成員相關的子集:應該在使用之前初始化C++類的Qt類數據成員嗎?
- 確保對象在使用前被初始化。
- 確保所有構造函數初始化對象中的所有內容。
- 在每個構造函數的初始化程序列表中初始化數據成員通常比在其正文中更有效。
- 在初始化程序列表中,數據成員應按照它們聲明的順序列出。
考慮下面的類使用Qt類類型的數據成員:
class MyClass {
public:
myClass();
~myClass();
private:
int myInt;
QString myQString;
QList<QString> myQList;
QHash<int, QString> myQHash;
char * pChar;
};
通過應用上述最佳實踐,構造函數代碼將如下所示:
MyClass::MyClass() :
myInt(0), // OK, primitive should be initialized.
myQString(), // Is this really needed?
myQList(), // Is this really needed?
myQHash(), // Is this really needed?
pChar(NULL) // OK, pointer should be initialized.
{
}
然而,我有一個印象,並不是所有的Qt類數據成員都需要初始化。但我不是100%肯定的。一些開發人員爭辯說,通過將所有數據成員放入初始化列表中,我們可以避免忽略應初始化的一些重要數據成員的初始化。但是,如果這是一個真正的問題,我寧願把一個註釋行對於不需要初始化每個數據成員,例如:
總之,我想知道一個Qt類時數據成員應該被初始化,並且當不需要初始化時,以及爲什麼。謝謝!
我忘了提及,對於類MyClass中涉及的所有Qt類,我們可以假定它們有一個可用的0參數構造函數。也就是說,'QString :: QString()','QList :: QList()'和'QHash :: QHash()'是可用的。有了這個假設,原來的問題可能會導致另外兩個問題: 問題1:MyClass :: MyClass()的兩個版本是否等同?也就是說,他們是否產生了2個相同內容的對象? Q2:一個版本比另一個更快嗎? – jonathanzh