(newAge = age) != (age = newAge)
-
Hallo,
ich lerne C++ und bin im Moment bei Klassen angelangt.
Ich habe hier eine Klasse die zwar funktioniert doch eines verstehe ich dann doch nicht.#include <iostream> using namespace std; class Dog { private: int age; public: void setAge(int newAge); int getAge() { return age; } //Funktionsimplementation innerhalb }; int main() { Dog bello; //Objekte bello erzeugen int alter; cout << "Alter eingeben: "; cin >> alter; bello.setAge(alter); // Objekt bello aus Klasse Dog mit "alter" deklarieren cout << "Bello ist " << bello.getAge() << " Jahre alt" << endl; } // Funktionsimplementation ausserhalb void Dog::setAge(int newAge) { age = newAge; // newAge = age; gibt immer 0 aus ??? warum ? }
Wenn ich über die Eingabe nun 5 eingebe dann spuckt der auch 5 aus.
Meine Frage ist jetzt aber, wenn ich in der Funktionsimplematation anstatt age = newAge nun aber newAge = age schreibe dann spuckt der immer nur 0 aus. Wo ist denn hier der Unterschied dazwischen. Das verstehe ich nicht.
age = newAge // Zuweisung des Wertes von newAge an age
newAge = age // Zuweisung des Wertes von age an newAge
Müsste doch das selbe sein?
Erklärung: Bitte ich von euch
Danke im voraus.PS: Das Beispiel habe ich aus einem Tutorial von Volkard.de
-
void Dog::setAge(int &newAge) { newAge = age; }
das "&" bedeutet, du hast eine referenz, also, grob gesagt, deine funktion darf die variable ändern. (stichworte: call by value, call by reference)
-
ich glaub irgendwie net das
age = newAge // Zuweisung des Wertes von newAge an age
newAge = age // Zuweisung des Wertes von age an newAgediese beiden gleich sind....
-
age = newAge // Zuweisung des Wertes von newAge an age
newAge = age // Zuweisung des Wertes von age an newAgeja, aber du veränderst in der Funktion nicht den Wert von "alter", sondern von newAge.
newAge ist eine eigenständige Variable, die nur den Wert von alter besitzt. newAge ist lediglich eine Kopie von alter.wie freier benutzername schon gesagt hat, du musst entweder eine Referenz oder einen Pointer übergeben. Wenn du
void Dog::setAge(int &newAge) { newAge = age; }
schreiben würdest, währe newAge keine Kopie mehr, sondern eine Referenz. Eine Referenz ist eigentlich nur ein Alias für eine Variable. Das heißt, dass wenn du nun diese Funktion aufrufst und ihr alter übergibst, dann ist newAge ein Alias für alter, keine Kopie mehr.
Das bedeutet das alle Operationen, die du auf newAge ausfürst, auch auf alter ausführst.
-
[unfug]
DEvent schrieb:
ich glaub irgendwie net das
age = newAge // Zuweisung des Wertes von newAge an age
newAge = age // Zuweisung des Wertes von age an newAgediese beiden gleich sind....
doch doch, das eine ist ein left-to-right-operator, das andere ein right-to-left.
das erkennt man an dem überladenen fehlenden zweiten leerzeichen zwischen "age" und "="[/unfug]
-
wenn ich die frage richtig verstehe dann ist nicht klar warum ein
Dog nach der konstruktion immer 0 jahre alt ist.
der grund:
da die klasse Dog keinen constructor hat wird von compiler ein default constructor
generiert der alle member-variablen mit deren default construktor initialisiert.in diesem fall
Dog::Dog():age(0){}
Kurt
-
ZuK schrieb:
der grund:
da die klasse Dog keinen constructor hat wird von compiler ein default constructor
generiert der alle member-variablen mit deren default construktor initialisiert.in diesem fall
Dog::Dog():age(0){}
Das heißt ja dann, wenn ich schreibe newAge = age
dann würde ich den Wert '0' (default constructor-wert von age) der Variablen newAge zuweisen? ist das der Grund warum es dann immer 0 gibt?
das klingt zumindest einleuchtend!Ich dachte zuerst was anderes: sobald man die funktion verlässt wird ja der Inhalt der funktion aus dem Speicher gelöscht, doch dann ist es auch egal wie die Zuweisung sich nennt weil ich ja kein "static" deklariert habe.
Das mit der Referenz kannte ich. Neugierig war ich trotzdem weil ich so was schon mal erlebt habe, allerdings weiß ich nicht mehr wobei *vergessen*.
Ich habe das Kapitel erst angefangen und versuche immer direkt es in die Praktik um zu setzen. Konstruktor und Destruktor habe ich noch nicht, das machen ich morgen vielleicht. Eventuell verstehe ich es dann besser.
Mit Referenzen sollte ich mir aber auch angewöhnen öfters zu arbeiten.Danke an alle