2016-04-01 69 views
1

假設我正在使用名爲Engine的類。從我的理解是,初始化這個類,並創建一個新的對象的方式可以像做以下幾點:困惑於如何初始化類成員

string type = "v8"; 
Engine engine(type); 

這將創建一個新的引擎對象... 所以,現在如果我有一個第二類所謂的汽車擁有引擎類的成員:

Car.h

class Car 
{ 
    private: 
     Engine engine; 
    public: 
     Car(); 
} 

Car.cpp

Car::Car() { 
    // Need to initialize Engine 
} 

我該如何初始化成員引擎,是不是已經從頭文件初始化了?我很困惑,因爲如果Engine有多態構造函數,其中一個構造函數Engine()和另一個引擎(字符串)不會在Car頭文件中初始化?我如何知道我想要的,這將在汽車的構造

回答

2

它的工作原理是這樣被初始化一個空的發動機元件汽車:

Car::Car(void) : engine("whatever you want") 
{ 
} 

這將告訴您如何初始化類的成員。 不同的汽車構造過載可以不同的方式初始化你的引擎

0

你有3個選項(從C++ 11開始)。

您可以使用類內初始值設定項。像這樣:

struct A { 
    int i = 42; 
}; 

您可以使用成員初始化列表。就像這樣:

struct B { 
B() : i{42} {} 
    int i; 
}; 

或者你可以指定在構造函數體成員(如果它有一個默認的構造函數就已經默認後初始化)。就像這樣:

struct C { 
    C() { i = 42; } 
    int i; 
}; 

最後的選擇通常不是你想要的,因爲在成員將首先默認構造在進入構造函數體之前發生在成員初始化的一部分,這種情況下,什麼(見上文struct B ),然後你隨後分配給它。這與我在這些示例中使用的int類型無關,但對於構​​建和分配它很昂貴的類型可能很重要。

你也可以結合3種形式。例如:

struct D { 
    D() : i{1} // this overrules the in-class initializer 
    { i = 3; // assign a new value despite the fact that we constructed the object already 
    } 
    int i = 0; // initial value 
};