Verständniss Problem
-
Also:
Wenn ich das aktuelle Objekt per Zeiger übergebe bleibt die Inkrementierung (alter++) erhalten d.h. Dennis ist und bleibt 31 Jahre alt.
Verwende ich aber keine Zeiger so wird der inkrementierte Wert mit dem ursprünglichen (Leute dennis(30)) überschrieben????Hab' ich das richtig verstanden??
MfG CSS
-
Das liegt an folgender Tatsache: Wenn du dennis als Referenz oder Zeiger an eine Funktion übergibst, übergibst du quasi nur die Information, wo im Speicher "Dennis" liegt. Die Funktion greift dann auf diesen Speicher zu und verändert ihn. Sobald du dann wieder in der Funktion Main bist kannst du auf den veränderten Speicher zugreifen und das alter ist gestiegen. Wenn du dennis als Wert an eine Funktion übergibst, wird eine Kopie von dennis angelegt und an die Funktion übergeben. Die Funktion ändert den "Dennis" den du in Main erschafffen hast überhaupt nicht, sondern erhöht nur das alter der Kopie. Dennis ist also eine lokale Variable innerhalb der Funktion uebergabe_wert oder wie du sie genannt hast. Eine Lösung wäre in Main direkt dennis.altern() aufzurufen oder mit einem Rückgabewert zu arbeiten:
[cpp]int altern() // (innerhalb der Klasse)
{
alter++;
return alter;
}// ...
cout << "Dennis ist " << dennis.altern() << " Jahre alt." // in main()
ich hoffe mal, ich hab jetzt keinen stuß erzählt oder völligen schwachsinn erzählt, ich bin nämlich selber noch relativ neu in dem Gebiet ^^
-
ZuK schrieb:
CSS schrieb:
Verwende ich aber keine Zeiger oder Referenzen so wird folgendes ausgegeben:
// Dennis ist 30 Jahre alt
// Dennis ist 30 Jahre alt
// Dennis ist 30 Jahre altWie meinst du das ?
etwa so ?int main() { Leute dennis(30); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; dennis.altern(); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; dennis.altern(); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; return 0; }
Kurt
Ja, genauso meine ich das!
PS: Ich glaube jetzt habe ich es verstanden
EDIT:
Per Zeiger oder Referenz wird das Objekt altern() direkt verändert. Ohne Zeiger oder Referenzen wird eine Kopie des Objekts angefertigt, also ein lokales Objekt erzeugt, das aber nach Ende der Funktion "gelöscht" wird.
MfG CSS
-
wenn du mit "Verwende ich aber keine Zeiger oder Referenzen" meinst
void uebergebe_kopie(Leute par) { par.altern(); }
dann stimmt natürlich was DarkSea und Ixtana gesagt haben.
Kurt
-
int main() { Leute dennis(30); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; dennis.altern(); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; dennis.altern(); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; return 0; }
aber das müsste doch eigentlich funktionieren oder ?
-
DarkSea schrieb:
aber das müsste doch eigentlich funktionieren oder ?
sehe ich auch so.
Kurt
-
CSS schrieb:
#include <iostream> using namespace std; class Leute { int alter; public: Leute(int age) {alter = age;} void altern() {alter++;} int get_alter() {return alter;} }; void uebergebe_zeiger(Leute par) //er meinte diese funktionen { par->altern(); } void uebergebe_referenz(Leute par) //siehe oben { par.altern(); } int main() { Leute dennis(30); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; uebergebe_zeiger(&dennis); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; uebergebe_referenz(dennis); cout << "Dennis ist " << dennis.get_alter() << " Jahre alt\n"; return 0; }
es sollte immer 30 herauskommen... eben aufgrund der lokalen kopie...
wenn man dennis.altern() schreibt, dann kommt 30, 31, 32 heraus....
-
Ich habe jetzt eine logische Erklärung dafür gecodet:
1. Programme ohne Zeiger:
#include <iostream> using namespace std; void wechseln(int parameter) { cout << "Variable nach dem Funktionsaufruf:\t" << parameter << endl; parameter = parameter / 2; cout << "Variable nach der Berechnung:\t\t" << parameter << endl; } int main() { int variable = 20; cout << "Variable vor dem Funktionsaufruf:\t" << variable << endl; wechseln(variable); cout << "Variable nach dem Beenden der Funktion\t" << variable << endl; cin.get(); //Warten bis <Return> return 0; }
Ausgabe dieses Programms.
Variable vor dem Funktionsaufruf: 20
Variable vor dem Funktionsaufruf: 20
Variable nach der Berechnung: 10;
Variable nach dem Beenden der Funktion: 20--------------------------------------------------------------------------------
2. Programm mit Zeigern
#include <iostream> using namespace std; void wechseln(int *parameter) { cout << "Variable nach dem Funktionsaufruf:\t" << *parameter << endl; *parameter = *parameter / 2; cout << "Variable nach der Berechnung:\t\t" << *parameter << endl; } int main() { int variable = 20; cout << "Variable vor dem Funktionsaufruf:\t" << variable << endl; wechseln(&variable); cout << "Variable nach dem Beenden der Funktion:\t" << variable << endl; cin.get(); //Warten bis <Return> return 0; }
Ausgabe dieses Programms.
Variable vor dem Funktionsaufruf: 20
Variable vor dem Funktionsaufruf: 20
Variable nach der Berechnung: 10;
Variable nach dem Beenden der Funktion: 10--------------------------------------------------------------------------------
-
you got it.
Kurt
-