Konstruktoren implementieren?
-
Hi,
Hab leider die Vorlesung zur Einführung in Klassen verpasst und hänge nun an den Konstruktoren fest. Ich weiß dass der Konstruktor in der Klassendefinition definiert werden muss und dann mit Klassenname::Konstruktorname implementiert werden muss, ich weiß jedoch nicht wie so eine Implementierung aussehen muss.
Meine Idee wäreKlassenname::Klassenname(Instanzvariable){ this -> Instanzvariable = Instanzvariable; }
Kann man das so machen?
Außerdem weiß ich nicht ob die Instanzvariablen der Klasse in der Konstruktordefinition oder direkt als private in der Klassendefinition.
Danke schon im Voraus für Antworten!Cheers,
Flügelnuss
-
flügelnuss schrieb:
Ich weiß dass der Konstruktor in der Klassendefinition definiert werden muss
Nee, wenn du keinen brauchst, definierst du keinen.
"Instanzvariable" hört sich komisch an, aber das wär schon so in etwa die Idee. Über den Konstruktor übergibt man der Klasse die Werte, die sie unbedingt zur Initialisierung braucht und ohne die sie nicht sinnvoll wäre.
-
Mechanics schrieb:
"Instanzvariable" hört sich komisch an
Hab das aus den Vorlesungsfolien, wie nennt man die denn sonst?
Ich glaub Konstruktoren verstehe ich so langsam aber mir tut sich eine neue Frage auf: Wie kann ich die Instanzvariablen als Parameter für Methoden der Klasse mitgeben?
void print();//Definition ... //Implementierung void Klassenname::print(){ cout << Instanzvariable; } ... //Aufruf Objektname.print();
Ich dachte mir dass der Compiler durch den expliziten Aufruf mit Objektname. der Methode die Instanzvariablen gleich mitgibt, stimmt aber wohl nicht.
-
Warum nimmst du das an?
-
flügelnuss schrieb:
Mechanics schrieb:
"Instanzvariable" hört sich komisch an
Hab das aus den Vorlesungsfolien, wie nennt man die denn sonst?
(nicht-statische) Membervariable, Datenmember o.ä. sagen wir hier, aber Instanzvariable ist IMHO auch OK. Hört sich an wie Terminologie aus Smalltalk. Klassenvariablen wären dann statische Membervariablen.
Ich glaub Konstruktoren verstehe ich so langsam aber mir tut sich eine neue Frage auf: Wie kann ich die Instanzvariablen als Parameter für Methoden der Klasse mitgeben?
Brauchst du nicht.
Ich dachte mir dass der Compiler durch den expliziten Aufruf mit Objektname. der Methode die Instanzvariablen gleich mitgibt, stimmt aber wohl nicht.
Er übergibt die ganze Instanz (im this-Zeiger), alle Instanzvariablen stehen damit zur Verfügung.
-
[quote="flügelnuss"]
Mechanics schrieb:
Hab das aus den Vorlesungsfolien, wie nennt man die denn sonst?
Das eine ist eine Instanzvariable, und der Parameter ist ein Parameter. Du hast beides "Instanzvariable" genannt. Deswegen komischer Name, als ob du eine "Instanzvariable" übergeben würdest. Du übergibst aber einen Wert. Ich glaub, da wären x und y weniger verwirrend gewesen
flügelnuss schrieb:
Ich dachte mir dass der Compiler durch den expliziten Aufruf mit Objektname. der Methode die Instanzvariablen gleich mitgibt, stimmt aber wohl nicht.
Die Methode kann auf die Instanzvariable zugreifen, die muss man nicht mitgeben. Bzw., was mitgegeben wird, ist ein versteckter "this" Parameter. Du kannst in der Methode also auf this->Instanzvariable, oder einfach Instanzvariable zugreifen.
-
Ganz interessant wäre vielleicht folgendes (tut mir leid, mir ist der Fachbegriff entronnen. Vielleicht initialize-irgendwas):
class Foo { public: Foo(bar b, abc a) : myB{b}, myAbc{a} { } private: bar myB; abc myAbc; };
Wenn ich mich richtig erinnere, ist dies sogar die bevorzugte Methode, um Member zu initialisieren. Hat was damit zu tun, dass du mit Folgendem
Foo::Foo(bar b, abc a) { myB = b; myAbc = a; }
Schon default-initialisierten Membern nochmals ihre eigentlichen Werte zuweist.
Die obere Methode drückt also das Prinzip der Initialisierung direkter aus. Außerdem ist so garantiert, dass du nicht ausversehen Member verwendest, die noch nicht (mit brauchbaren Werten) initialisiert wurden. (wenn man es dann nicht generell vergisst)Hoffe das war terminologistisch und so ok ausgedrückt, ansonsten darf man mich gern korrigieren.
-
@hardware
Das nennt manmember initializer list
.
(Manchmal sieht man auch den Begriffinitialization list
, der Standard verwendet den AFAIK aber nicht.)
Wichtig ist dabei dass du das "member" nicht unterschlängst, denn sonst könnte auch einestd::initializer_list
gemeint sein. Was wieder ganz was anderes ist.
-
jaa genau, deshalb war ich mir unsicher, da ich ja unter initializer list auch was anderes verstanden hab, dankesehr für die Aufklärung.