this.Zeiger vs. Initialisiererliste

pap

Mitglied
Hallo, ich habe mal folgende Frage:
Wenn ich folgede Klassendefinition gegeben habe:
Code:
c l a s s   C1  {
p r i v a t e :
i n t   z a h l 1 ,   z a h l 2 ,   z a h l 3 ;
}

und einen Konstruktor erstellen will, bei dem alle Paramter initialisiert werden, wie mache ich das durch einen this.Zeiger und /oder einer Initialisiererliste? Hat einer der beiden Methoden einen Vorteil?
 
Hi

kannst du ein Beispiel zeigen, was du meinst?
Unter "Initialisierung über this.Zeiger" und "Initialisiererliste" kann ich mir nicht viel vorstellen.
 
Ich vermute er meint das:
C++:
C1::C1(int z1, int z2, int z3) : zahl1(z1), zahl2(z2), zahl3(z3)
{
}

// vs

C1::C1(int z1, int z2, int z3)
{
   zahl1 = z1;
   zahl2 = z2;
   zahl3 = z3;
}
 
Hi.

Grundsätzlich sollte man in der Initialisierungsliste des Konstruktors initialisieren. Dazu ist sie schließlich da.

Das hat den Vorteil, das nur initialisiert wird und nicht initialisert (Standardkonstruktor aufgerufen) und danach zugewiesen wird.

Bsp:
C++:
class A {
  std::string s1;
  std::string s2;
public:
  A() : s1("abc") {
    s2 = "xyz";
  }
};
Hier wird beim Aufruf des Konstruktors das Attribut s1 mit "abc" initialisiert (std::string(const char*) Konstruktor aufgerufen).

Das Attribut s2 wird auch initialisiert (std::string() Standard-Konstruktor wird aufgerufen) und danach wird der Wert "xyz" an s2 zugewiesen (std::string::operator=(const char*) Zuweisungsoperator wird aufgerufen).

Die zweite Variante kann also sehr ungünstig sein, wenn eine Initialisierung und darauffolgende Zuweisung relativ "teuer" ist. Das sollte man vermeiden.

Bei intrinsischen Typen (int, float usw.) und Zeigern spielt das allerdings keine Rolle (diese werden nicht automatisch initialisiert).

Siehe http://www.parashift.com/c++-faq-lite/intrinsic-types.html#faq-26.8
und http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.6

Gruß
 
Zurück