我知道,對於非POD類型的默認初始化也將默認通過調用其默認構造函數初始化非靜態非POD成員變量。但我不確定這是怎麼發生的。這裏是我的意思的例子:困惑用戶如何空定義的構造函數將初始化非靜態非POD的成員變量
#include <iostream>
#include <vector>
using namespace std;
class Test2 {
public:
Test2() {cout <<"Here";}
};
class Test {
public:
Test() {}
Test2 i;
};
int main() {
Test foo;
}
輸出是:
Here
基於C++的初始化標準(8.5),默認初始化:
— if T is a non-POD class type (clause 9), the default constructor
for T is called (and the initialization is ill-formed if T has no
accessible default constructor);
所以鑑於此,我確實希望默認構造函數Test()
會被調用,但是類Test
的空默認構造函數不會初始化Test2 i
expli毋庸置疑,Test2()
不知何故被暗中調用。我想知道的是這是怎麼發生的?同樣,對於值初始化(與上面的例子沒有關係),如果一個空的用戶定義的默認構造函數沒有顯式地初始化一個POD非靜態成員變量,那麼這個變量如何得到零初始化(我知道它是這樣做的做)?由於基於標準,似乎對於值初始化來說,當你有一個用戶定義的默認構造函數時發生的一切就是構造函數被調用。
的值初始化C++標準的相應部分如下:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the
default constructor for T is called (and the initialization is ill-formed if T has no
accessible default constructor);
這個問題類似於c++ empty constructor and member initialization 但不同的是,而不是問最終結果的行爲是什麼,我會想知道爲什麼會發生最終結果行爲。
編譯器寫入遵循的標準奠定了規則,標準說,X應該發生在情況Y中,所以編譯器發出代碼來在情況Y中執行X.我不明白這是如何造成混淆的。 –
如果你沒有在構造函數中初始化它的初始化爲ou –
@Benjamin:我的困惑是,我認爲X應該發生在情況Y有副作用,其中副作用不被我上面列出的標準解釋。 – user1082160