call by Value und Objekte

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
laparmakerli
Beiträge: 4
Registriert: Do Okt 11, 2012 2:21 pm

call by Value und Objekte

Beitrag von laparmakerli » Do Okt 11, 2012 3:36 pm

Ich habe eine Frage zur Übergabe von Objekten als Parameter und dazu folgenden Code:

Code: Alles auswählen

#include <iostream>
using namespace std;

struct pkw{
	int leistung;
	
	pkw(){
		leistung = 60;
	}

	void tunen(){
		leistung += 20;
	}
};

void test(pkw a){
	a.tunen();
}

int main(){
	pkw pkw1;
	cout << pkw1.leistung << endl;
	pkw1.tunen();
	cout << pkw1.leistung << endl;		
}
Ausgabe wie folgt:
60
80

Und zwar übergebe ich der Test-Funktion ein PKW-Objekt. Dabei müsste ja (nach dem CallByValue-Prinzip) eine Kopie dieses PKW-Objektes angelegt werden mit dem die Funktion dann anschließend arbeitet. In der Funktion wird dann die Leistung des PKW's getuned. Allerdings wurde dabei auch die Leistung des ursprünlichen PKWs den ich als Paramerer übergeben habe erhöht. Widerspricht das nicht dem CallByValue-Prinzip?
Scheinbar wurde doch nur die Referenz auf das Objekt kopiert und letztendlich zeigen beide Variablen auf den selben PKW. So kenne ich das auch aus Java, wo implizit die Referenz auf das Objekt kopiert wird. Ich dachte allerdings, dass Referenzen auf Objekte in C++ explizit mittels * deklariert werden und dann mittels (->)-Operanden auf die Member zugreifen. Da ich in der test-Funktion mit dem (.)-Operanden arbeite müsste es sich doch direkt um das Objekt selbst handeln und nicht um eine Referenz, oder?
Was habe ich da falsch verstanden?

mfg Lars

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: call by Value und Objekte

Beitrag von nufan » Do Okt 11, 2012 3:43 pm

Hallo :)
laparmakerli hat geschrieben:Und zwar übergebe ich der Test-Funktion ein PKW-Objekt.
Wo genau machst du das denn? ^^
laparmakerli hat geschrieben:Widerspricht das nicht dem CallByValue-Prinzip?
Doch, aber du rufst das ganze nicht so auf wie du es beschreibst ;)
laparmakerli hat geschrieben:Ich dachte allerdings, dass Referenzen auf Objekte in C++ explizit mittels * deklariert werden und dann mittels (->)-Operanden auf die Member zugreifen. Da ich in der test-Funktion mit dem (.)-Operanden arbeite müsste es sich doch direkt um das Objekt selbst handeln und nicht um eine Referenz, oder?
Du verwechselst hier zwei wesentliche Teile von C/C++, mit denen du zwar ähnliche Dinge anstellen kannst, die aber syntaktisch recht verschieden sind:
Zeiger: http://www.proggen.org/doku.php?id=c:tutorial:pointer
Referenzen: http://www.proggen.org/doku.php?id=cpp:ref:start

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: call by Value und Objekte

Beitrag von Xin » Do Okt 11, 2012 3:44 pm

laparmakerli hat geschrieben:Was habe ich da falsch verstanden?
Alles richtig verstanden, aber ruf die Test-Funktion doch mal ;-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

laparmakerli
Beiträge: 4
Registriert: Do Okt 11, 2012 2:21 pm

Re: call by Value und Objekte

Beitrag von laparmakerli » Do Okt 11, 2012 6:34 pm

Mein Gott, richtig,, ich hab versehentlich pkw1.tunen(); in der main-methode aufgerufen statt test(pkw1); und wenns richtig ist bleibt die leistung auch unverändert.
Mit den Begriffen bin ich am Ende etwas durcheinander gekommen. Anfangs fällt es mir da echt schwer sprachlich zwischen Zeigern und Referenzen zu unterscheiden. Insbesondere, da man Zeiger-Variablen ja auch "dereferenzieren" kann und durch die Übergabe von Zeigern als Parameter auch ein "call by reference" simuliert wird, wenn ich das richtig verstanden habe, Da Referenzen ja mit C++ neu eingeführt wurden, wirkt es auf mich so, als hätte man einfach eine sichere Alternative zu den Zeigern gesucht, die aber in der Regel den gleichen Zweck erfüllen soll. Ist es in C++ heute üblich beides zu benutzen, oder kommt man eigentlich nur mit Referenzen aus?

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: call by Value und Objekte

Beitrag von nufan » Do Okt 11, 2012 6:48 pm

laparmakerli hat geschrieben:Ist es in C++ heute üblich beides zu benutzen, oder kommt man eigentlich nur mit Referenzen aus?
Du kannst Referenzen komplett mit Zeigern abbilden, umgekehrt aber nicht. Deine Aussage ist also gerade falsch herum, man kommt nur mit Zeigern aus.
Referenzen bieten dir Sicherheit, wie du sie mit Zeigern nicht hast. Eine Referenz ist in C++ immer ein gültiges Objekt mit einem eindeutigen Typ. Eine null-Referenz wie in Java gibt es nicht. Außerdem kannst du mit Referenzen optisch schöneren Code schreiben, weil du dir die Dereferenzierung des Zeigers ersparst.
Einen Zeiger kannst du auf eine beliebige Adresse zeigen lassen. Wenn du einen Zeiger an eine Funktion übergibst, hast du keine Gewähr, dass an dieser Adresse gültiger Speicher oder gar ein gültiges Objekt liegt. Weiters kann man Zeiger in C/C++ leicht casten.
Du musst selbst entscheiden können, wann du Zeiger oder Referenzen verwendest.
Kurz: Ja, ist es. Nein, kommt man nicht ^^

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: call by Value und Objekte

Beitrag von Xin » Do Okt 11, 2012 8:06 pm

laparmakerli hat geschrieben:Mein Gott, richtig
Der Moment der Erkenntnis... schön, oder? ^^
laparmakerli hat geschrieben:Mit den Begriffen bin ich am Ende etwas durcheinander gekommen. Anfangs fällt es mir da echt schwer sprachlich zwischen Zeigern und Referenzen zu unterscheiden. Insbesondere, da man Zeiger-Variablen ja auch "dereferenzieren" kann und durch die Übergabe von Zeigern als Parameter auch ein "call by reference" simuliert wird
Nein, eigentlich wird da nichts simuliert, ungeschickte Lehrer verkaufen Dir das nur als "Call By Reference". Die Übergabe eines Zeigers ist "Call By Value" - und das Value ist der Zeiger. Für "Call By Reference" brauchst Du auch wirklich eine Referenz.
laparmakerli hat geschrieben:, wenn ich das richtig verstanden habe, Da Referenzen ja mit C++ neu eingeführt wurden, wirkt es auf mich so, als hätte man einfach eine sichere Alternative zu den Zeigern gesucht, die aber in der Regel den gleichen Zweck erfüllen soll. Ist es in C++ heute üblich beides zu benutzen, oder kommt man eigentlich nur mit Referenzen aus?
Referenzen und Zeiger haben - wenn man sie richtig benutzt - unterschiedliche Aufgaben. Die Semantik einer Referenz ist, dass man etwas referenziert und der eines Zeigers ist irgendwo hin zu zeigen. Du kannst Deine Hand in die Luft halten, den Finger ausstrecken und ins Nichts zeigen. Du kannst aber nicht "nichts" referenzieren. Wenn Du eine Referenz (ein Empfehlungsschreiben) hast, dann lässt sich das auf die Person zurückführen, die das Schreiben aufgesetzt hat. Eine nicht unterschriebenes Schreiben, dass Du ein toller Kerl bist, ist keine Referenz. Für eine Referenz muss auf etwas referenzieren, was existiert, was Du greifen kannst.
Ein Zeiger ist eine Adresse, aber da muss keiner wohnen. Referenz und Zeiger sind also semantisch vollkommen unterschiedlich.

Eine Referenz auf ein Buch muss also ein vorhandenes Buch referenzieren. Ein Zeiger auf ein Buch, ist die Positionsangabe, wo das Buch zu finden ist - ob da ein Buch liegt... man weiß es nicht. Darum ist eine Referenz auf ein Buch auch eben dieses Buch und ein Zeiger auf ein Buch ein eigener Datentyp, dessen Wert per Call By Value übergeben werden kann und der genauso gut ins Nirwana zeigen kann.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

laparmakerli
Beiträge: 4
Registriert: Do Okt 11, 2012 2:21 pm

Re: call by Value und Objekte

Beitrag von laparmakerli » Do Okt 11, 2012 11:13 pm

Danke, das hat mir geholfen. Der Unterschied ist mir jetzt erstmals deutlich klarer :)

Antworten