如果成員對象data
確實不是出現在構造函數的初始化列表中,那麼data
由其默認構造函數構造。什麼時候在構造函數初始化列表中初始化時構造成員對象?
如果data
出現在構造函數的初始化列表,則簡直是初始化給定值。這是否意味着沒有創建data
的構造函數?那麼如何構造新對象data
?
如果成員對象data
確實不是出現在構造函數的初始化列表中,那麼data
由其默認構造函數構造。什麼時候在構造函數初始化列表中初始化時構造成員對象?
如果data
出現在構造函數的初始化列表,則簡直是初始化給定值。這是否意味着沒有創建data
的構造函數?那麼如何構造新對象data
?
。
不,它使用提供的任何參數進行初始化。如果它有一個類的類型,那麼參數將被傳遞給一個合適的構造函數。
這是否意味着沒有創建數據的構造函數調用?
不。如果它具有類類型,則通過調用構造函數完成初始化。
當您在構造函數的初始化列表中初始化data
時,將調用其參數化構造函數。
例子:
#include <iostream>
#include <string>
class Data {
public:
Data(int firstArg, std::string mSecondArg)
{
std::cout<<"parameterized constructor called"<<std::endl;
}
};
class SomeClass {
public:
SomeClass(int firstArg, std::string secondArg) : data(firstArg, secondArg) {}
private:
Data data;
};
int main(int argc, char** argv) {
SomeClass someObj = new SomeClass(0, new std::string("empty"));
return 0;
}
有了這個代碼,如果數據出現在構造函數的初始化列表,那麼它只是初始化爲給定值,你會得到輸出
parameterized constructor called
§12.6.2/ 7:在MEM-初始化表達式列表或支撐-INIT-列表被用於初始化指定子對象(或者,在一個委派構造的情況下,完整的類對象)根據初始化規則8.5進行直接初始化。
換句話說,這意味着正常的構造函數被調用。
例如:
class Foo { Bar bar; Foo() : bar(...) { } };
是analoguous創建Bar
對象作爲這樣:
Bar bar (...);