剛想C++編碼樣式簡單的問題,類的初始化列表
例如,一個類的所有成員變量將與初始化列表中的默認構造函數被調用,如果我們沒有做任何事情。 B默認的構造函數將被調用,值將被設置爲0,int();
class A
{
A();
private:
B b;
int value;
}
但是我的問題是,即使做了默認的構造函數將被稱爲是一個好習慣,總是自己做還是它只是添加額外的行代碼
A ::一():b(),value(){}
剛想C++編碼樣式簡單的問題,類的初始化列表
例如,一個類的所有成員變量將與初始化列表中的默認構造函數被調用,如果我們沒有做任何事情。 B默認的構造函數將被調用,值將被設置爲0,int();
class A
{
A();
private:
B b;
int value;
}
但是我的問題是,即使做了默認的構造函數將被稱爲是一個好習慣,總是自己做還是它只是添加額外的行代碼
A ::一():b(),value(){}
將默認的構造函數放在外面是個好主意。編譯器生成的構造函數比編寫自己的版本更可靠和可維護,除了其他任何東西外,編譯器可以爲您編寫的代碼都浪費時間。如果你不需要任何構造邏輯,那麼不要寫一個構造函數。
但是,int
不會被初始化,除非你這樣做,這是一個糟糕的理由,必須寫一個構造函數。
默認情況下,int變量沒有用值初始化 - 你必須自己做。
因此,當你沒有在構造函數中將成員變量「value」設置爲某個值時,它將保持未初始化狀態。
默認的構造函數將只爲具有默認構造函數的類類型而不是基元調用。
您正在觸及C++的一個粘性角落。
對象中POD值的初始化是粘性的,取決於幾件事情。
即使我不確定我能否正確地掌握所有規則,但我相信@Steve Jessop曾經在這裏寫過一篇關於SO的文章(儘管我現在可以找到它)。
但一些例子:
這個班上總是會被初始化b ==虛假和值= 0
class A
{
A() : b(), value() {}
B b;
int value;
};
如果沒有一個明確的默認構造更復雜:
這裏編譯器會爲你生成一個默認的構造函數。但編譯器如何生成默認構造函數取決於情況。所述編譯器生成的默認的構造可以做兩種不同形式的初始化並用於依賴於上下文:
例子:
class B
{
B b;
int value;
};
// Variables of static storage duration (notably globals)
// Will be zero initialized and thus b == false and value = 0
B global; // Initialized
int main()
{
// Object of automatic storage duration or dynamic storage duration
// These will depend on how they are declared.
// Value Initialization (POD re-mains undefined)
B bo1; // b/value undefined
B* bp1 = new B; // b.balue undefined
// Zero Initialization
B bo2 = B(); // b = false, value = 0
B* bp2 = new B(); // b = false, value = 0
// Note: The most obvious syntax for zero initializing a local object
// does not work as it is actually interpreted as a forward
// declaration of a function;
B bo3();
}
你什麼意思? – Eilidh 2011-01-07 11:56:02
即使是空的,輸入A :: A(){}總是一個好主意嗎? – Eilidh 2011-01-07 11:56:45