Konstruktoren

sry: naja wie man es sieht, ich dachte yuro meint das Objekt(also den Zeiger), also inst1 bzw. inst2
 
es ist nix geheim :D... nur ich dachte das man hier nix vollständiges posten darf.. also was ich jetzt hier reingestellt hab war ne andere aufgabe.. und ich sollte aus diesem programm abschnitt alles ermitteln.. dann hab ich einem kollegen gesagt das der destruktor die beiden delete zeilen sind er sagt mir es ist die zeile mit der } - Klammer.. also NACH delete
 
Man darf schon vollständige Sachen posten, warum auch nicht :confused:
Aber was Anderes: Bitte Netiquette, §15 beachten.

Also generell noch mal:

Ein Konstruktor wird dann aufgerufen, wenn eine Instanz erstellt wird.
Das ist bei mittagessen usw. in der Zeile, in der man die Variable eben anlegt.
Bei inst1/inst2 und anderen Pointern ist es da, wo "=new..." steht.
In der Klasse ist der Konstruktor die Funktion, die gleich heißt wie die Klasse selber.
Es kann auch mehrere K. geben, die verschiedene Parameter nehmen.
zB. einen, der keinen Parameter braucht, und einen, der drei int nimmt.
Je nachdem, was man beim Erstellen der Variable übergibt (nichts oder eben 3 int)
wird der passende vom Compiler genommen.

Der Copykonstruktor (damits kürzer ist: CC) ist ein Sonderfall von K., der statt 3 int
oder so eine andere Variable von seiner Klasse nimmt, um anhand der Werte von der schon bestehenden Variable eine "Kopie" zu machen.

Der Zuweisungsoperator (=-Op) ist auch dafür da, die Werte von einer anderen Variable zu kopieren (wie bei int usw.). Im Unterschied zum CC wird der =-Op. dann genommen, wenn die betroffene Variable nicht gerade erst angelegt wird, sondern schon vorher existiert hat.
Sinn: Bei CC und = muss man ja - je nach Sinn der Klasse - nicht jede Variable 1:1 kopieren,
sondern kann bestimmte Variablen auch anders behandeln.
Wenn der CC aufgerufen wird, weiß man, dass die Anderen noch keinen Wert haben und auch was brauchen. Bei = weiß man, dass der CC damit schon was gemacht hat, und kann sich auf gültige Werte verlassen.

Und der Destruktor wird - als Gegenteil vom Konstruktor - dann aufgerufen, wenn die Instanz der Variable gelöscht wird. Sinn: zB. in der Klasse geöffnete Dateien zu schließen etc.
Nicht-Pointer-Variablen wie mittagessen verschwinden am Schluss des {}-Blocks, wo sie gemacht wurden, dort wird auch der Dest. aufgerufen (sieht man eben nicht im Code, macht der Compiler dazu). Pointer wie inst1, die die Instanz per new erhalten haben, werden nicht automatisch am Ende von {} weggeräumt, sondern mit einem delete. Dann ist beim delete der Dest.

So, hoffe, jetzt sind alle Klarheiten beseitigt :D

Gruß
 
@sheel mega geile erklärung dankeeeeee dir :)

hab noch ne kleine Frage zu "virtual"... was ist der Sinn dieser funktion****?
 
Am Beispiel vom inst2 im Code:
Das ist ein eigentlich Buchung, bekommt aber ein Überweisung.
Möglich deshalb, weil Überweisung von Buchung erbt (ist ja auch eine Buchung, nur eine spezielle).

Angenommen, es gibt noch Steuerzahlung, das auch von Buchung erbt.
Also einerseits erbt Überweisung von Buchung, unabhängig von der Überweisung erbt auch Steuerzahlung von Buchung.

Und jetzt haben alle drei Klassen eine Funktion/Methode "Name", die am Bildschirm was ausgibt:
Bei Buchung wird "Das ist irgendeine Buchung" ausgegeben.
Bei Überweisung wird "Das ist eine Überweisung" ausgegeben.
Bei Steuerzahlung wird "Das ist eine Steuerzahlung" ausgegeben.

Wenn man jetzt eine Buchung-Variable macht und Name aufruft, wird
"Das ist irgendeine Buchung" ausgegeben.
Bei einer Überweisung-Variable "Das ist eine Überweisung",
und bei Steuerzahlung eben Steuerzahlung.
Soweit alles in Ordnung.

Wenn man jetzt aber (wie bei inst2 oben) eine Buchungsvariale macht,
aber zB. in Wirklichkeit eine Steuerzahlung reinspeichert, und dann
Name auruft, kommt "Das ist irgendeine Buchung" heraus.
Obwohl ja Steuerzahlung drin ist.

Wenn Name jetzt virtual ist bekommt man wirklich "Das ist eine Steuerzahlung".
Ohne virtual wirds also vom "offiziellen" Variablentyp genommen,
mit virtual vom tatsächlichen Inhalt.

Gruß
 
@sheel ich danke dir für die ganzen informationen! jetzt bin ich fit für die prüfung :)

also wenn du java auch so super erklären kannst komm ich demnächst auf dich zurück. da hab ich nämlich auch noch so paar fragen hehe :)
 
Zurück