Variable kopieren
lima-city → Forum → Programmiersprachen → C/C++ und D
beispiel
code
eigenschaft
hund
instanz
kapitel
klasse
klasse hund
kopieren
methode
objekt
operator
person
pointer
rasse
referenz
regel
sex
welt
zeiger
-
servus,
gibt es in c++ eine möglichkeit, variablen bzw. den wert einer variable zu kopieren?
damit meine ich nicht zeiger, da bei denen das problem ist, wenn ich die originalvariable manipuliere, manipuliere ich automatisch den zeiger mit.
mfg splinto
[edit]
sorry für den sinnlosen thread. die lösung war so einfach, dass ich nicht darauf gekommen bin...
string1 = string2;
Beitrag zuletzt geändert: 26.8.2009 17:16:10 von splinto -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Solange es triviale Typen sind, reicht der Zuweisungsoperator, um Werte zuzuweisen.
int a = 5; int b = 3; a = b;
Wie du richtig erkannt hast, werden mit dem Zuweisungsoperator bei Objekten (also Instanzen von Klassen) nur die Referenzen zugewiesen. Um eine Objekt zu kopieren, sprich, um es zu klonen und die neue Referenz zuzuweisen, musst du den Zuweisungoperator überladen.
class Person { int age; boolean sex; Person& operator= (const Person& o) { age = o.age; sex = o.sex; return *this; } };
EDIT:
splinto schrieb: servus,
sorry für den sinnlosen thread. die lösung war so einfach, dass ich nicht darauf gekommen bin...
string1 = string2;
Das geht aber auch nur bei der Klasse String, die wieder einen überladenen Assignmentoperator mitbringt. Bei reinen char-Pointern weißt du auch hier nur die Referenz zu.
Beitrag zuletzt geändert: 26.8.2009 18:27:07 von census -
was ist ein überladener assignmentoperator?
und was genau ist die referenz, die ich bei einem char-pointer zuweiße? (habe das kapitel 'referenzen' in einem online tutorial übersprungen.) -
splinto schrieb:
was ist ein überladener assignmentoperator?
und was genau ist die referenz, die ich bei einem char-pointer zuweiße? (habe das kapitel 'referenzen' in einem online tutorial übersprungen.)
Das mit dem Überspringen der Referenzen war nicht so schlau, weil Objekte und Referenzen das Alpha und Omega der objektorientierten Programmierung sind. Das ist so wie: "Ich habe einen Kochkurs gemacht, nur das Thema "Salz" hab ich ausgelassen".
Hier die Grundbegriffe:
Eine Klasse ist eine Sammlung von Eigenschaften und Methoden (ganz schlechte Definition, aber alles andere würde das Forum sprengen).
Ein Objekt ist eine Instanz einer Klasse (auf dem Heap).
Eine Referenz ist eine Variable, die ein Objekt referenziert, also auf es hinweist.
Zum Beispiel kann "Hund" eine Klasse sein mit den Eigenschaften Rasse und Alter und den Methoden bellen und kacken. Hund stellt keinen speziellen Hund dar, sondern die ontologische Klasse aller Hunde unseres Denkens.
Das Gebilde aus 60 kg Knochen, Fleisch und Wut, dass beim Nachbarn wohnt und dich jeden Morgen anbellt, genau das ist ein Objekt (eine Instanz) der Klasse Hund.
Dieses Objekt kann nun mehrere Referenzen haben, die sich auf ihn beziehen. Zum Beispiel die Referenz "Spike" (die sein Herrchen benutzt) oder "Drecksköter von nebenan" (die du benutzt).
Um es in C-Jargon zu sagen sind Referenzen Zeiger auf Objekte. In der Regel sind die Begriffe Zeiger (Pointer) und Referenzen (references) austauschbar, solange man weiß wovon man spricht. Zeiger kommt aus der prozeduralen Welt, Referenz hingegen kommt aus der OO-Welt. Nicht zu verwechseln mit Handles, das sind Zeiger auf Zeiger (FILE** handle).
Der Assignmentoperator ist der Operator =, der dem linken Argument den Inhalt (also einen Wert, eine Referenz oder einen Zeiger) des rechten Wertes zuweist. Zum Beispiel:
answer = 42;
Viele Klassen überladen diesen Operator, so dass er nicht die Referenz zuweist, sondern auf dem Heap eine neue Instanz der Klasse anlegt und die Eigenschaft des Originals klont. In der Regel implementiert man den Assignmentoperator und ruft ihn dann auch im Copy-Konstruktor auf um Tipperei zu sparen. Ein Copy-Konstruktor ist ein Konstruktor der als einziges Argument eine Referenz auf ein Objekt der selben Klasse erhält. Also:
class Dog { private: int age; char* race; public: // Copy-Construktor Dog (const Dog& o) { *this = o; } // überladener Assignmentoperator Dog& operator= (const Dog& o) { this->age = o.age; strcpy (this->race, o.race); return *this; } }
Wenn du jetzt schreibst:
Dog a; Dog b = a;
Dann referenzieren a und b nicht denselben Hund, sondern der Hund a wurde einmal mit Haut und Haaren geklont. -
achso, ja jetzt weiß ich wie du das meinst. vielen dank für die ausführliche erklärung!
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage