2016-04-01 13 views
1
initialisiert werden

Angenommen, ich arbeite mit einer Klasse namens Engine. Von dem, was ich verstehe, ist, dass die Art und Weise, diese Klasse zu initialisieren und ein neues Objekt erstellen kann wie folgt aus erfolgen:Verwirrt, wie Klassenmitglieder

ein neuen Motor Objekt
string type = "v8"; 
Engine engine(type); 

Das schafft ... So, jetzt was passiert, wenn ich eine zweite Klasse genannt Auto, das ein Mitglied der Motorklasse:

Car.h

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

Car.cpp

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

Wie würde ich Member-Engine initialisieren, ist es nicht bereits aus der Header-Datei initialisiert? Ich bin verwirrt, weil, wenn Engine polymorphe Konstruktoren hat, in denen ein Konstruktor Engine() und eine andere Engine (String), würde es nicht in der Auto-Header initialisiert werden? Wie kann ich Auto sagen, dass ich einen leeren Motor Mitglied möge, die

Antwort

2

in Auto-Konstruktor initialisiert wird Es funktioniert wie folgt:

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

Dies besagt, wie die Mitglieder Ihrer Klasse zu initialisieren. Verschiedene Auto-Konstruktor-Überladungen können Ihre Engine auf verschiedene Arten initialisieren

0

Sie haben 3 Optionen (ab C++ 11).

Sie können einen In-Class-Initialisierer verwenden. Wie folgt:

struct A { 
    int i = 42; 
}; 

Sie können die Elementinitialisierungsliste verwenden. Wie folgt aus:

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

Oder Sie können das Mitglied im Konstruktor Körper zuweisen (nachdem es standardmäßig initialisiert wurde, wenn es einen Standard-Konstruktor). Wie folgt aus:

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

Die letzte Option ist in der Regel nicht, was Sie wollen, da in diesem Fall das Mitglied zunächst als Teil des Elements Initialisierung aufgebaut Verzug, dass der Körper des Konstrukteurs geschieht vor (siehe struct B oben eingegeben) und dann ordnen Sie ihm anschließend zu. Das ist irrelevant für einen Typ wie int, den ich in diesen Beispielen verwende, aber für Typen, die teuer zu bauen und zuzuordnen sind, kann es von Bedeutung sein.

Sie können auch die 3 Formen kombinieren. Zum Beispiel:

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 
};