Konstruktor initializer list
-
Hi,
Ich wurde vor kurzem gefragt, wo denn der Unterschied liegt zwischen:Class A { public: A() : m_a(0) , m_b(0) , m_oc("test") {}; int m_a; int m_b; Otherclass m_oc; };Class A { public: A() { m_a = 0; m_b = 0; m_oc = Otherclass("test"); }; int m_a; int m_b; Otherclass m_oc; };Ich weiß, dass die obere Variante vorzuziehen ist, aber warum?
-
Mehrere Gründe:
Nur mit der Liste lassen sich Memberkonstanten und -Referenzen initialisieren. Das geht im Konstruktorrumpf gar nicht.
Außerdem werden im Falle von komplexen Objekten als Member im zweiten Fall erst die Standardkonstruktoren aufgerufden, was u.U. noch eine ganze Reihe weiterer Konstruktoraufrufe nach sich zieht (z.B. wenn das komplexe Memberobjekt selbst noch komplexe Objekte enthält, wie z.B. std::string), und dann nochmal der Zuweisungsoperator. Das kostet Zeit.
-
Nennt sich übrigens Initialisierungsliste...
Weil sie schneller ist (in der unteren Lösung werden die beiden ints erst erstellt und dann extra zugewiesen - mit IL (das geht immer so schwer zu tippen ^^) passiert das gleichzeitig)...
Auch muss man const-Member per IL initialisieren...bb
-
danke,
stimmt, an konstanten habe ich nicht gedacht