Problem mit string?!
-
Ich habe gerade versucht diese Schreibweise in meinem C++ Buch zu finden... leider erfolglos

Was heißt denn wstring& (genauer gesagt das & nach einer Klasse)? Gibt es dafür vllt einen "Suchbegriff" unter dem ich was in meinem Buch finden kann?
lg absolut_nooby
-
absolut_nooby schrieb:
Gibt es dafür vllt einen "Suchbegriff" unter dem ich was in meinem Buch finden kann?
Referenz
-
absolut_nooby schrieb:
Ich habe gerade versucht diese Schreibweise in meinem C++ Buch zu finden... leider erfolglos

Unfassbar. Welches Buch?
-
Das Buch ist von Bjarne Stroustrup: Einführung in die Programmierung mit C++.
Mit dem Suchbegriff Referenz ist auf jeden Fall der erste Teil geklärt... aber der 2. teil ist mir noch nicht so ganz klar:
const wstring& GettemplateName() const { return templateName; }Heißt das, das ich durch den Aufruf der Funktion eine Referenz (in Form eines Zeigers) zurückgegeben bekomme, die constant (und damit nicht veränderbar ist)? Es wird also keine Kopie erstellt und damit kann ich den Wert nicht verändern?
-
Ja richtig. Möchtest du den wert änderbar machen fügr ein
wstring& GettemplateName() { return templateName; }dazu.
-
absolut_nooby schrieb:
Das Buch ist von Bjarne Stroustrup: Einführung in die Programmierung mit C++.
Das sollte übrigens in Kapitel 8.5 stehen, sofern die deutsche Ausgabe nicht großartig anders ist als die englische.
-
Hi,
bezüglich dieser pass-by-reference Thematik:
Wenn ich eine Referenz übergebe wird ja keine Kopie meiner Variablen erstellt. Falls ich jedoch nicht pass-by- reference benutze wird ja dann folgendermaßen eine Kopie erstellt.
Bei Standard Datentypen ist das ja ok. Aber wie wird denn eine Kopie meiner eigenen Klasse erstellt? Brauche ich dafür eine Copy- Methode oder geht das automatisch?
-
absolut_nooby schrieb:
Hi,
bezüglich dieser pass-by-reference Thematik:
Wenn ich eine Referenz übergebe wird ja keine Kopie meiner Variablen erstellt. Falls ich jedoch nicht pass-by- reference benutze wird ja dann folgendermaßen eine Kopie erstellt.
Bei Standard Datentypen ist das ja ok. Aber wie wird denn eine Kopie meiner eigenen Klasse erstellt? Brauche ich dafür eine Copy- Methode oder geht das automatisch?Wenn du keine Copy-Methode (genannt Kopierkonstruktor) hast, wird automatisch einer erzeugt. Dieser ruft einfach den Kopierkonstruktor aller Membervariablen auf. Dies ist oft das was man will, so dass man diesen Konstruktor nicht selber schreiben braucht.
Gleiches gilt für Zuweisungsoperator, Destruktor und Standardkonstruktor, die ebenfalls alle automatisch erzeugt werden wenn man sie nicht selber schreibt (Ausnahme beim Standardkonstruktor: Es darf überhaupt kein anderer Konstruktor vorhanden sein).
-
SeppJ schrieb:
... (Ausnahme beim Standardkonstruktor: Es darf überhaupt kein anderer Konstruktor vorhanden sein).
Will heissen: Sobald du einen eigenen Konstruktor angibst, wird kein Konstruktor mehr vom compiler erstellt. Unter einem Standardkonstruktor versteht man einen Konstruktor, der ohne Argumente aufgerufen werden kann. Dies kann also durchaus ein parametrisierter Konstruktor sein, wenn für die Parameter default-Werte angegeben werden.
Beim automatisch erstellten Konstruktor wird allerdings immer nur eine flat-copy gemacht. Will heissen, wenn deine Klasse pointer als member hat, so werden nur die Pointer kopiert. Die Pointer beider Objekte zeigen nach dem Kopiervorgang auf den gleichen Speicherbereich (meist eine schlechte Idee).
Dies wäre ein Fall, in dem du lieber einen eigenen angeben solltest um eine deep-copy zu erstellen. Du würdest also Speicher allozieren, die entsprechenden Werte kopieren und den pointer des neu erstellten (also der Kopie) Objektes auf den von dir allozierten Speicher zeigen lassen.
-
Und wenn wir schon dabei sind, sollte man noch folgende wichtige Faustregel nennen: Wenn dir der Defaultdestruktor, Default-Copy-Konstruktor oder der Default-Zuweisungsoperator nicht ausreichen, dann gilt das in der Regel auch für die jeweils anderen aus dieser Liste.
Und jetzt bist du vermutlich total verwirrt :xmas2: .
-

-
Um ehrlich zu sein, bin ich nun schon ein bischen verwirrt. Aber dieses Problem umgehe ich, in dem ich einfach überall pass-by-reference oder pass-by-const-ref anwende ;-).
Falls ich dann doch mal ne Kopie brauche, muss ich mir das nochmal genauer anschauen ;-).
Gibt es da wiedermal einen "Suchbegriff" für?
-
http://de.wikipedia.org/wiki/Dreierregel_(C%2B%2B)
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-and-swap