3 Stimmen

C++-Konstruktor-Definition

Alle Konstruktormethoden hier tun das Gleiche. Ich benutze meistens Methode 2, habe aber heute zum ersten Mal Methode 3 gesehen. Ich habe Methode1 an einigen Stellen gesehen, weiß aber nicht, was die genauen Unterschiede zwischen ihnen sind? Welche Methode ist die beste, um Konstruktoren zu definieren und warum? Gibt es irgendwelche Probleme mit der Leistung?

  1 class Test
  2 {
  3     private:
  4         int a;
  5         char *b;
  6     public:
  7         Test(){};
  8         
  9         // method 1
 10         Test(int &vara, char *& varb) : a(vara), b(varb){}
 11         
 12         // method 2
 13         Test(int &vara, char *& varb)
 14         {
 15             a = vara;
 16             b = varb;
 17         }   
 18         
 19         //method 3
 20         Test(int &vara, char *& varb)
 21         {
 22             this->a = vara;
 23             this->b = varb;
 24         }   
 25         
 26         ~Test(){}
 27 }; 

Ich habe hier einfache Felder int und char* verwendet, was wird passieren, wenn ich viele Felder oder komplexe Typen wie struct habe?

Danke

1voto

Jaime Garcia Punkte 6214

Methode 3 wird in der Regel verwendet, wenn Sie etwas haben wie

Test (int &a, char &b) 
{
    this->a = a;
    this->b = b;
}

um vollständig sicherzustellen, dass Sie die Klassenfelder a und b setzen, ist es im Grunde dasselbe wie Methode 2.

1voto

jalf Punkte 235501

Sie tun nicht dasselbe.

Methode 1 initialisiert die Klassenmitglieder mit den angegebenen Werten.

Bei den Methoden 2 und 3 werden zunächst die Mitglieder standardmäßig initialisiert (was bei Nicht-POD-Typen bedeutet, dass der Standardkonstruktor aufgerufen wird), und dann ruft den Zuweisungsoperator auf, um ihnen einen neuen Wert zuzuweisen.

Mit anderen Worten: 2 und 3 lassen sich nicht kompilieren, wenn die Klasse Referenzen enthält oder wenn eines der Mitglieder keinen Standardkonstruktor hat. Auch bei den meisten Nicht-POD-Typen wird die Kompilierung langsamer sein.

Mit anderen Worten: Verwenden Sie die Initialisierungsliste (Methode 1). Dafür ist sie ja da. Unter dem Gesichtspunkt der Korrektheit ist es besser wie auch Leistungsaspekte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X