Wertzuweisung bei Aufruf des Konstruktors

xkris

Mitglied
Hallo,

ich verstehe folgenden Konstruktor nicht:

Code:
CSerial::CSerial() : hComm(INVALID_HANDLE_VALUE)

Dabei ist CSerial die Klasse,
CSerial() der Konstruktor und
hComm eine als private deklarierte membervariable vom Typ Handle der Klasse CSerial.
Dieser wird, wenn ich das richtig verstehe(?) der Wert INVALID_HANDLE_VALUE zugewiesen.

Wenn es sich hier um eine Art Wertzuweisung handelt, habe ich das in dieser Form noch nie gesehen. Wobei ich zugegebenermassen ohnehin noch nicht viel gesehen habe :)

Normalerweise würde ich das in der Form erwarten:

Code:
CSerial::CSerial()  //wozu man hier den Gültigkeitsoperator :: benötigt ist mir auch nicht klar
{
   hComm=INVALID_HANDLE_VALUE ;
}

Vielleicht kann mir das ja jemand erklären :rolleyes:

Ich sach mal vielen Dank im Voraus

Gruß

kristian
 
Die Notation mit dem Doppelpunkt erlaubt bei Konstruktoren einzelnen Variablen Standardwerte zu definieren.
Code:
CSerial::CSerial() : hComm(INVALID_HANDLE_VALUE)
ist gleich wie:
Code:
CSerial::CSerial() 
{
 hComm = INVALID_HANDLE_VALUE;
}

Zum Gültikeitsoperator:
Wenn du dich nicht innerhalb der Klassendeklaration befindest musst du zum definieren von Funktionen den Gültigkeitsoperator verwenden.
Code:
 //CSerial.h
class CSerial
{
CSerial();    // innerhalb der Klassendeklaration
...

Code:
// CSerial.cpp
#include "CSerial.h"
CSerial::CSerial() : hComm(INVALID_HANDLE_VALUE)   // du befindest dich nicht mehr innerhalb der Klassendeklaration
...

Du kannst die Funktionen auch direkt in der Klassendeklaration definieren. Doch dann werden sie als "inline" angesehen.

Hoffentlich ist dir klar was ich meine. Ich habe ein bisschen Mühe das ganze zu erklären.

Gruss LukeS
 
Die Notation mit dem Doppelpunkt erlaubt bei Konstruktoren einzelnen Variablen Standardwerte zu definieren.
Code:
CSerial::CSerial() : hComm(INVALID_HANDLE_VALUE)
ist gleich wie:
Code:
CSerial::CSerial() 
{
 hComm = INVALID_HANDLE_VALUE;
}


Prinzipiell stimmt das, jedoch gibt es einen kleinen Unterschied zwischen den beiden Beispielen. Der erste Fall entspricht ungefähr diesem
Code:
int x = 5;

während der zweite Fall diesem entspricht:
Code:
int x;
x = 5;

Das Ergebnis ist natürlich das gleiche (eine variable x mit dem Wert 5), der zweite Weg kostet aber mehr Schritte, ergo mehr Performance.

http://www.tantalon.com/pete/cppopt/asyougo.htm#PreferInitialization
 
Prinzipiell erlaubt diese Schreibweise, den Konstruktor einer Membervariablen aufzurufen. Wenn Du z.B. eine Membervariable hast, dessen Klasse keinen Standard-Konstruktor hat, dann mußt Du diese Membervariable so initialisieren.
 

Neue Beiträge

Zurück