2009-07-19 6 views
3

Ich bin gerade auf den folgenden Quellcode eines Konstruktors gestoßen.C++ Anfängerfrage: Konstruktor

testProg::testProg() : CCProg() 
{ 
m_UID = n_UID = 0; 
} 

Normalerweise sieht ein Konstruktor als nach meinem Verständnis folgt:

testProg::testProg()  
{  
m_UID = n_UID = 0;  
}  

Also ich frage mich, was der Zweck dieses CCProg ist(), wäre toll, wenn jemand mich schnell sagen konnte, Was geht hier vor sich. Vielen Dank!

Antwort

16

Es scheint, dass testProg von CCProg erbt, und der No-Args-Konstruktor für CCProg wird von initialization list des testProg-Konstruktors aufgerufen.

Da es sich um den No-Args-Konstruktor handelt, der aufgerufen wird, ist der explizite Aufruf nicht unbedingt erforderlich (er würde implizit sowieso genannt). Daher wird diese Syntax hauptsächlich dazu verwendet, einen übergeordneten Konstruktor aufzurufen, der Argumente entgegennimmt.

Zum Beispiel:

testProg::testProg(int days) : CCProg(days) 
{ 
m_UID = n_UID = 0; 
} 

Wenn hier der expliziten Aufruf wurde ausgelassen, die Nein-args Konstruktor würde implicity aufgerufen werden, wenn eine verfügbar waren, sonst wäre Kompilierung fehlschlagen. Beachten Sie, dass es auch möglich ist (obwohl weit weniger wahrscheinlich), dass CCProg der Name einer Membervariablen ist, die zu testProg gehört - auch hier ist der explizite Aufruf des Konstruktors ohne Argumente nicht erforderlich, da dies implizit genannt würde .

+2

Korrekt. Zum Vorteil des OP werden diese im C++ - Jargon "Konstruktor-Initialisierungslisten" genannt. – oggy

6

Es ist entweder ein expliziter Aufruf des Basisklassenkonstruktor, wenn die Klasse wie folgt aussieht:

class testProg : public CCProg 

oder (weniger wahrscheinlich) einen Anruf eine Membervariable zu initialisieren, wenn die Klasse wie folgt aussieht:

class testProg 
{ 
    Something CCProg; 
    // ... 
+0

+1 für die Erwähnung beider Möglichkeiten – MSalters

4

Entweder:

  • Klasse TESTPROG von Klasse CCProg abgeleitet wird, oder
  • Klasse TESTPROG verfügt über ein integriertes Objekt mit dem Namen CCProg

In beiden Fällen ist es ein expliziter Aufruf an einen Konstruktor CCProg, und weil es ein parameterlose Konstruktor, durfte nennen, aber nicht unbedingt notwendig .

Wenn jedoch CCProg einen Konstruktor mit einem int-Parameter hatte, würden Sie es mit so etwas wie

testProg::testProg() : CCProg(1) { } 

nennen müssen Diese Syntax ermöglicht es Ihnen, einen Konstruktor zu wählen (bei CCProg hat mehr als 1) und Übergeben Sie einen Wert. Beachten Sie auch die Reihenfolge, in der die Dinge passieren: CCProg wird erstellt, bevor der Testprogra tor eingegeben wird.

0

Durch diesen Code wird der Konstruktor der Klasse CCProg() explizit aufgerufen.

In einer Vererbungsarchitektur können wir diese Technik verwenden, um den Aufwand beim erneuten Schreiben des Konstruktors der Basisklasse zu sparen.