![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
Wird x.Quotient() vor x.Setzen() aufgerufen, so haben die
Variablen i und j keinen definierten Wert (eine zufällige Bitfolge
im den Variablen i und j zugewiesenen Speicher).
Der Quotient ist also undefiniert!
Konstruktoren tragen immer den Namen der Klasse. Sie besitzen
keinen Rückgabewert (auch nicht void ). Konstruktoren können
überladen werden.

Member-Initialisierung, Definition von Member-Inhalten bei Aufruf
von Konstruktoren.
< Klasse>::< Klasse>(...) : Member1( Wert1), ... ,
MemberN( WertN)
Wert können dabei auch beliebige, bereits deklarierte, Funktionen
oder komplexe Ausdrücke sein.
Beispiel::Beispiel() : i(0), j(1)
Die Member-Initialisierung ist die einzige Möglichkeit,
konstante Member zu initialisieren!
Member-Inhalte können auch im Funktionskörper des Konstruktors
zugewiesen werden. Im Gegensatz zur Member-Initialisierung ist eine
Wertzuweisung für konstante Member hier nicht möglich.
Grundsätzlich sollten alle Member, soweit möglich, über
Member-Initialisierung definiert werden.
schlechtes Beispiel:
Beispiel::Beispiel(int a,int b)
{
i = 2*(a/2);
j = 2*((b+1)/2)-1;
}

Copy-Konstruktor , Konstruktor zur Erzeugung
einer Kopie eines Objektes.
Der Copy-Konstruktor einer Klasse wird aufgerufen bei Definitionen
( Beispiel a = b ) oder ,,Call-by-Value``-Übergabe eines Objektes an eine
Funktion.
class Beispiel
{
.
.
Beispiel(Beispiel&);
.
.
}
Beispiel::Beispiel(Beispiel& a)
{
i = a.i;
j = a.j;
}
main()
{
Beispiel a(1,2);
Beispiel b = a; /* a wird kopiert und b} zugewiesen */
}
Wird kein Copy-Konstruktor definiert, so werden standardmäßig die
Inhalte aller Member kopiert. Dies kann Probleme bei dynamischer Speicherverwaltung
aufwerfen!
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |