[C++] Unverständlicher Code

Ansics

Cadet 4th Year
Registriert
Mai 2003
Beiträge
107
Hi Leute,

Ich habe hier folgenden Code Schnipsel:


CommServer::CommServer() : mReadFd(3), mWriteFd(4), rdfd(mReadFd)
{
mBufferSize = DEFAULT_BUFFER_SIZE;
mBuffer = new char[mBufferSize];
}


Das ganze ist in C++ geschrieben. Kann mir jemand helfen und mir sagen, was die Notation in der ersten zeile soll? Speziell der ":" zwischen Commserver() und mReadFd(3). Heißt der Doppelpunkt in C++ nicht Vererbung?
Wenn es das heißen würde wäre es sehr merkwürdig, da mReadFd int-Typen sind, die in der Commserver.h Datei angegeben sind.
Ich werde leider nicht serh schlau daraus. Weist man durch mReadFd(3) der Variablen mReadFd den Standardwert 3 zu, oder wie ist das gemeint?

Danke für eure Hilfe
Ansics
 
AW: Unverständlicher Code

Ich bin mir nicht mehr ganz sicher aber mit Vererbung hat das jedenfalls nichts zu tun.

So weit ich weiß ist das einfach nur eine Unübersichtliche Schreibweise.

Ich glaube, dass ist gleichbedeutend mit dem hier:

Code:
 CommServer::CommServer() 
{
mReadFd=4;
mWriteFd=4;
rdfd=mReadFd;
mBufferSize = DEFAULT_BUFFER_SIZE;
mBuffer = new char[mBufferSize];
}

Kann aber auch sein, dass ich mich irre.

Irgendwo hatte ich das mal erklärt vielleicht finde ich die Erklärung noch.

EDIT: so jetzt hab ichs :) Das ganze nennt sich Initialisierungsliste. Also war ich gar nicht so falsch. Das ist bei Konstruktoren einfach eine andere Schreibweise.
 
Zuletzt bearbeitet:
AW: Unverständlicher Code

Jau danke. Ich dachte mir irgendwie auch schon sowas, aber jetzt fühl ich mich bestätigt :) danke sehr.

Aber vielleicht noch ne Frage hinterher: Dieser Codeschnipsel hat was mit Soccetprogrammierung zu tun. In der gleichen Datei komm auch nochmal folgendes vor:

CommServer::SelectInput()
{
fd_set readfds;
FD_ZERO(&readfds);
FD_SET(mReadFd,&readfds);

return select(mReadFd+1,&readfds, 0, 0, 0) > 0;
}

Da scheint irgendwas mit Sockets zu geschehen, aber im Quellcode wird nirgendwo ein Socket erstellt. Ich arbeite unter Linux.

VG
Ansics
 
AW: Unverständlicher Code

Ja genau, es handelt sich dabei um die Klasseninitialisierung. Auf diese Weise lassen sich z.B. konstante Klassenattribute initialisieren. Ich habe auch mal irgendwo gelesen, dass es wohl ein wenig effizienter laufen sollte als die Einfache Zuweisung innerhalb des Konstruktors. Ich verwende eigentlich nur noch diese Form.
 
AW: Unverständlicher Code

daemon777 schrieb:
So weit ich weiß ist das einfach nur eine Unübersichtliche Schreibweise.

Ich glaube, dass ist gleichbedeutend mit dem hier:

Naja unübersichtlich ist Ansichtssache :) Auf keinen Fall ist es aber gleichbedeutend.

In der Initialisierungsliste werden alle Member initialisiert, erst danach wird der Konstruktorrumpf aufgeführt. Für normale integrale Datentypen ist das noch egal. Aber mal angenommen das hier:

Code:
class A
{
public:
   A();
   A(int);

...

};

...

class B
{
public:
   B();
private:
   A _a;
};

So, dann mal die verschiedenen Varianten verglichen:

Code:
B() : _a( 5) {}
Aufrufreihenfolge:
B()
A(int) (Member)

gegen

Code:
B() { _a = A(5) }
Aufrufreihenfolge:
B::B()
A::A() (Member) (implizit in der Initialisierungsliste)
A::A(int) (temp-Objekt)
A::operator= (Member) (operator= wird synthetisiert, wenn er nicht da ist)
A::~A() (temp-Objekt)


Hoffe das macht den Unterschied schonmal deutlich. Wenn z.B. kein Defaultkonstruktor vorhanden ist, ist zweitere Schreibweise garnicht möglich. Auch const-Member kann man nur über Initialisierungslisten setzen.

Generell ist es guter Stil (z.B. auch in den diversen Scott-Meyers-Büchern empfohlen), nur über Initialisierungslisten zu arbeiten und den Konstruktor-Rumpf nur zu benutzen wenn nötig.


Btw, über die Initialisierungsliste werden auch Basisklassen initialisiert. Da ist man dann sogar drauf angewiesen.
 
Zuletzt bearbeitet: (Syntaxfehler :-))
Zurück
Oben