const string&
-
Moin!
Lese gerade ein C++ Buch.
Dort in Kapitel Klassen folgendes Beispiel://....... class Konto { private: string name; unsigned long nr; double stand; public: bool init(const string&, unsigned long, double); void display(); } //dann Definition: bool Konto::init(const string& i_name, unsigned long i_nr, double i_stand) { //hier dann definierte die Parameter werden in die //Eigenschaften gespeichert }
meine Frage ist: warum wird hier ein Referenz benutzt
und nicht bei den anderen Parametern? Was Referenz ist weiss ich schon, aber hier verstehe nicht warum nur bei string?
P.S. wieviel Speicher belegt ein Referenz?
Danke!
-
herrlado schrieb:
Moin!
Lese gerade ein C++ Buch.
Dort in Kapitel Klassen folgendes Beispiel://....... class Konto { private: string name; unsigned long nr; double stand; public: bool init(const string&, unsigned long, double); void display(); } //dann Definition: bool Konto::init(const string& i_name, unsigned long i_nr, double i_stand) { //hier dann definierte die Parameter werden in die //Eigenschaften gespeichert }
meine Frage ist: warum wird hier ein Referenz benutzt
und nicht bei den anderen Parametern? Was Referenz ist weiss ich schon, aber hier verstehe nicht warum nur bei string?
P.S. wieviel Speicher belegt ein Referenz?
Danke!Eine Referenz kann man sich wie einen Pointer auf die ursprüngiche Variable vorstellen, denn man nicht mit * dreferenzieren muss. Das Problem bei string ist, dass bei einer Übergabe ohne Referenz der String kopiert würde. Also müßte der Copy-Konstruktor aufgerufen werden etc. Bei einer const Referenz entfällt dieser ganze Overhead. Normale Datentypen haben keinen Konstruktor. Da ist das unnötig.
-
Danke!Jetzt ist klar.
Ich denke das hätte auch im Buch stehen können, sonst ist verwirrend.1.Also strings und z.B. von mir erstellte Objekte immer über referenz übergeben? Aslo was nicht vom "Normalen Datentyp" ist.
Ist das richtig?
-
herrlado schrieb:
Danke!Jetzt ist klar.
Ich denke das hätte auch im Buch stehen können, sonst ist verwirrend.1.Also strings und z.B. von mir erstellte Objekte immer über referenz übergeben? Aslo was nicht vom "Normalen Datentyp" ist.
Ist das richtig?In den meisten Fällen schon.
-
Alles klar, Danke schön!
-
bool init(const string&, unsigned long, double);
Das hier ist übrigens sehr unschön, für die Initialisierung gibt es Konstruktoren!
-
Dieser Begriff sollte hier fallen: Shallow Copy.
Bezeichnet eine oberflächliche Kopie. Das heißt, dass nur die Referenzen kopiert werden. Folge: Zwei Pointer zeigen auf denselben Speicher, also String.
thx
-
gh0st124 schrieb:
Dieser Begriff sollte hier fallen: Shallow Copy.
Bezeichnet eine oberflächliche Kopie. Das heißt, dass nur die Referenzen kopiert werden. Folge: Zwei Pointer zeigen auf denselben Speicher, also String.
mal ne blöde Frage: wo findet hier eine flache Kopier statt?
-
herrlado schrieb:
1.Also strings und z.B. von mir erstellte Objekte immer über referenz übergeben? Aslo was nicht vom "Normalen Datentyp" ist.
Nur um die Kommunikation zu erleichtern: Diese "Normalen Datentypen" werden auch als builtin-Datentypen bezeichnet.
-
Du solltest aber auf Arrays von den einfachen Datentypen ebenfalls ne Referenz
übergeben.
-
SirLant schrieb:
Du solltest aber auf Arrays von den einfachen Datentypen ebenfalls ne Referenz
übergeben.Warum? Nur wenn ich dynamisch allokieren möchte, aber dass mache ich höchstens im Inneren einer Klasse ohne Funktionsaufruf.
-
gh0st124 schrieb:
Dieser Begriff sollte hier fallen: Shallow Copy.
Bezeichnet eine oberflächliche Kopie. Das heißt, dass nur die Referenzen kopiert werden. Folge: Zwei Pointer zeigen auf denselben Speicher, also String.
thx
Eine Referenz ist übrigens kein Pointer. Wenn ich einen String zuweise, dann wird er auch kopiert.
-
tobidope schrieb:
Eine Referenz ist übrigens kein Pointer. Wenn ich einen String zuweise, dann wird er auch kopiert.
Das wusste ich nicht. Bin ein HardCore C-Progger und möchte bald C++ lernen.
Bei einer Referenz werden also nur die Daten kopiert und nicht die Adresse.
Sehr praktisch, wenn ich mir überlege, dass ich in C immer eine Funktion copyString() aufgerufen habe...