frage zu konstruktoren
-
ich habe in meinem buch etwas zu klassen gefunden, ich verstehe bisher eigentlich alles ganz gut, aber ich weiß nicht genau was im einzelnen diese codezeilen bedeuten.
es ist zwar klar das rational aus zähler und nenner besteht, aber welche bedeutung hat dann:rational()
? und warum fehlt bei
rational(long)
die variable? kann man das einzelne
rational()
weglassen?
class rational { public: rational(); rational(long z, long n); rational(long); ... };
das andere zum thema member funktionen ist eigentlich ganz leicht aber die datentypen bereiten mir kopfzerbrechen, es würde mich sehr freuen wenn mir das jemand näher erklären könnte!
-
deexmac schrieb:
es ist zwar klar das rational aus zähler und nenner besteht, aber welche bedeutung hat dann:
rational()
?
Das ist der Standard-Konstruktor. Er wird aufgerufen, wenn du z.B. in der main()
Rational rational_obj;
schreibst. Schlage dazu am besten in deinem Buch/Tutorial nochmal das Kapitel Konstruktoren auf.
und warum fehlt bei
rational(long)
die variable?
Die fehlt, da dies nur die Deklaration der Funktion ist. D.h. du sagst dem Compiler: "Es gibt irgendwo einen Konstruktor Rational der einen Parameter vom Typ long besitzt.". In der Definition musst du den Variablennamen hinzuschreiben. In der Deklaration kannst du ihn weglassen.
kann man das einzelne
rational()
weglassen?
Ja Kannst du, dann musst du aber entsprechende andere Konstruktoren definieren. (Oder es halt bei dem vom Compiler definierten Ctor belassen). Wiederrum rate ich zum Nachschlag "Konstruktoren"
Caipi
-
Wenn du einen Konstruktor definierst, dann legt der Compiler keinen Standard-Konstruktor mehr an. Wenn du also einen Standard-Konstruktor für rational haben willst, musst du ihn noch explizit erzeugen.
Der Variablenname fehlt, weil sie bei der Deklaration nicht angegeben werden muss. Du kannst natürlich auch rational(long foobar); schreiben.
-
Das sind, wie du richtig erkannt hast, Konstruktoren, die dafür sorgen, daß du ein Objekt der Klasse Rational folgendermaßen erstellen kannst:
rational r1; // erster Konstruktor rational r2 (12); // zweiter Konstruktor rational r2 = 12; // dito rational r3 (3, 4); // dritter Konstruktor
In der Definition kann man die Variable weglassen (wenn man sie nicht braucht, auch in der Deklaration (siehe Postfix-Inkrement-/Dekrementoperator)), wird aber u.a. wegen CodeCompletition selten so gemacht.
/Edit: zweimal zu spät
Moritz
-
danke da hat mir bisher ziemlich weitergeholfen!
nur das noch nicht ganz:kann man das einzelne
Code:
rational()
Code:
rational()
Code:
rational()
weglassen?Ja Kannst du, dann musst du aber entsprechende andere Konstruktoren definieren. (Oder es halt bei dem vom Compiler definierten Ctor belassen).
in wie fern muss ich da andere konstruktoren definieren? muss der konstruktor eigentlich den selben namen wie die klasse in der definition besitze? in meinem buch und in beispielen sieht man es nur so.
C/C++ Code:
rational r1; // erster Konstruktor
rational r2 (12); // zweiter Konstruktor
rational r2 = 12; // dito
rational r3 (3, 4); // dritter Konstruktorentsprechend dem hier bräuchte ich theoretisch kein
rational()
p.s.:hätte auf anhieb garnicht mit so viel resonanz gerechnet
-
deexmac schrieb:
C/C++ Code:
rational r1; // erster Konstruktor
rational r2 (12); // zweiter Konstruktor
rational r2 = 12; // dito
rational r3 (3, 4); // dritter Konstruktorentsprechend dem hier bräuchte ich theoretisch kein
rational()
Doch, denn wenn du in eine Klasse nicht-Standard-Konstruktoren schreibst, macht der Compiler den Standardkonstruktor nicht mehr automatisch (kann ja sein, daß du den nicht willst).
-
danke