Das "&-Zeichen"
-
Vielleicht noch mit einem Link zu einem Tutorial, wo das erklärt wird:
http://tutorial.schornboeck.net/referenzen.htmGrüssli
-
hmmm - aber wenn ich mir das tutorial ansehe, dann steht doch links immer der typ, dann das &-Zeichen - und dann der Name der Referenz.
also irgendwas in der form: int& referenz.dann müsste ja in dem beispiel:
Vektor2d& operator*=(double s=;Vektor2d quasi ein Datentyp sein? Das ist doch eine Klasse - wie kann das sein?
-
Eine Klasse ist ein Datentyp.
MfG
-
Wanderfalke schrieb:
Vektor2d quasi ein Datentyp sein? Das ist doch eine Klasse - wie kann das sein?
Dir scheint relativ viel Grundwissen von C++ zu fehlen.

Klassen haben ja gerade den Sinn, eigene Datentypen zu repräsentieren, damit man eine logische Gliederung und Abstraktion in den Quellcode bringen und mit Objekten (objektorientiert) arbeiten kann.

-
Nexus schrieb:
Dir scheint relativ viel Grundwissen von C++ zu fehlen.

hmm ja das kann schon sein. Aber das Klassen einen eigenen Datentyp darstellen hab ich wirklich noch nie gehört. Auch jetzt als ichs gesucht hab, hab ich nichts dazu gefunden...
Gibts da vielleicht ein vernünftiges Buch, was man lesen könnte? Ich les im mom das Buch von Erlenkötter - aber da stand auch nix zu drin...

-
http://www.amazon.de/Lernen-professionell-anwenden-Ulla-Kirch-Prinz/dp/3826617649/
http://www.amazon.de/C-Primer-Stanley-B-Lippman/dp/3827326125/MfG
-
Super! Danke Dir!

-
Wanderfalke schrieb:
Gibts da vielleicht ein vernünftiges Buch, was man lesen könnte? Ich les im mom das Buch von Erlenkötter - aber da stand auch nix zu drin...

Dann schau nochmal dort nach, wo erlärt wird, wie man Variablen definiert. Da sollte dann das in etwa mal fallen. Falls wirklich nicht, wäre das ein Grund das Buch wirklich wegzuwerfen..
-
ich habs grad nochmal überflogen, aber nichts dazu gefunden... Ich guck später nochmal genauer.
ich hab noch eine Frage zu einem anderen Problem / anderem Programm:
// Programm zur Demonstration eines Kopierkonstruktors #include <iostream> using namespace std; class tKlasse { public: tKlasse() // Konstruktor: erzeugt externe Daten { Zeiger = new int; *Zeiger = 5; } ~tKlasse() // Destruktor: gibt externe Daten frei { delete Zeiger; Zeiger = 0; } void SetData(int a) { *Zeiger = a; } int GetData() { return *Zeiger; } tKlasse(const tKlasse& k) // Kopierkonstruktor { // zur Demonstration meldet er sich cout << "Kopierkonstruktor" << endl; // Externe Daten erzeugen und kopieren Zeiger = new int; *Zeiger = k.GetData(); // Normale Datenelemente auch kopieren sonstiges = k.sonstiges; } int sonstiges; // steht für die Nicht-Zeiger Datenelemente private: int *Zeiger; // Zeiger, also Kopierkonstruktor notwendig }; // Die Funktion dient nur zur Demonstration. Weil der Parameter // per Wert übergeben wird, wird beim Aufruf der // Kopierkonstruktor aufgerufen void Funktion(tKlasse para) { cout << "Funktion:" << para.GetData() << endl; } // Hauptprogramm zum Testen int main() { tKlasse Objekt; Objekt.SetData(7); Funktion(Objekt); // Hier wird der Kopierkonstruktor aktiv cout << Objekt.GetData() << endl; }Was ist nicht verstehe ist, wieso der Kopierkonstruktor aktiv wird. In der Zeile 50 steht ja erstmal nur ein Aufruf der Funktion "Funktion" Die Funktion ruft dann die Funktion getData auf - aber wo kommt da der Kopierkonstruktor ins Spiel?
Das Programm läuft doch nicht einfach von getData in den Kopierkonstruktor rein...?Könnt ihr mir da vielleicht nochmal helfen?
-
An die Funktion wird eine Kopie übergeben und für die Kopie braucht es nunmal den Kopierkonstruktor.
Aber das ist nur nochmals ein Hinweis, gutes Buch kaufen oder Tutorial machen. Das sind Grundlagen!Grüssli
-
Steht doch schon im Kommentar.
Funktion(Objekt) <- Da wird "Objekt" in "para" kopiert: void Funktion(tKlasse para)
MfG
-
Und genau das kannst du dir mit Referenzen sparen

-
ja das "gute buch" ist hoffentlich schon unterwegs zu mir und sollte hoffentlich morgen ankommen.

Der Kopierkonstruktor wird also automatisch sofort aufgerufen, wenn ich einfach nur Parameter übergebe? Da muss man nicht den KOnstuktor noch explizit aufrufen? Dass eine normale Parameteraufgabe gleich den Konstruktor auf den Plan ruft hatte ich auch nicht gedacht...
(hoffentlich kommt das buch bald... )
-
Du willst doch nicht unbedingt dass in deiner Funktion() mit dem originalen "Objekt" aus main() gearbeitet wird.
Und wenn doch, dann übergib per Referenz &. Dir bleibt die Wahl.
MfG
-
Wanderfalke schrieb:
ja das "gute buch" ist hoffentlich schon unterwegs zu mir und sollte hoffentlich morgen ankommen.

Der Kopierkonstruktor wird also automatisch sofort aufgerufen, wenn ich einfach nur Parameter übergebe? Da muss man nicht den KOnstuktor noch explizit aufrufen? Dass eine normale Parameteraufgabe gleich den Konstruktor auf den Plan ruft hatte ich auch nicht gedacht...
(hoffentlich kommt das buch bald... )
Der Kopierkonstruktor wird aufgerufen, wenn ein Objekt kopiert wird. Sprich bei einem Funktionsaufruf, der einen Typen T erwartet, wird bei der Übergabe des Objektes dieses kopiert und das immer. Man muss lediglich darauf achten, dass manchmal ein Zeiger oder eine Referenz erwartet wird, welche ebenfalls kopiert wird.
struct foo {}; void bar ( foo f ) { ... } ... foo g; bar ( g ); //Kopierkonstruktor wird aufgerufen, welcher implizit vom Compiler erstellt wird, sofern du keinen eigenen definierstEDIT:
Zu beachten ist auch, dass der Kopierkonstruktor nur dann aufgerufen wird, wenn tatsächlich ein neues Objekt erzeugt wird, was bei einer Zuweisung nicht der Fall ist. Dafür gibt es dann den =-Operator, welcher ebenfalls vom Compiler erstellt wird, wenn du keinen definierst.
-
Was bereits einigen Kopfzerbrechen bereitet hat, ist die zweite Deklaration:
MyClass Obj1; MyClass Obj2 = Obj1;Hier wird kein Zuweisungsoperator aufgerufen, das ist der Kopierkonstruktor. Also äquivalent zu:
MyClass Obj2(Obj1);drakon schrieb:
Der Kopierkonstruktor wird aufgerufen, wenn ein Objekt kopiert wird. Sprich bei einem Funktionsaufruf, der einen Typen T erwartet, wird bei der Übergabe des Objektes dieses kopiert und das immer. Man muss lediglich darauf achten, dass manchmal ein Zeiger oder eine Referenz erwartet wird, welche ebenfalls kopiert wird.
Um es vielleicht noch etwas klarer auszudrücken: Wenn ein Parameter ein Zeiger oder eine Referenz ist, wird das übergebene referenzierte Objekt nicht kopiert. Bei einem Zeiger wird dessen Adresse kopiert. Bei einer Referenz kann man nicht wirklich von Kopie sprechen, da Referenzen keine Objekte sind. Faktisch läuft es aber auf das Gleiche hinaus, also dass auf das übergebene Objekt nur verwiesen wird.
Ich hoffe, ich habe hiermit nicht zu viel Verwirrung gestiftet.
