call by value und Objekte



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

    #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



  • Du rufts test() nirgens auf. 🤡



  • 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?



  • kommt man eigentlich nur mit Referenzen aus

    Nein, Zeiger sind zwingend notwendig. Referenzen sind ein Sprachbonus.



  • laparmakerli schrieb:

    Insbesondere, da man Zeiger-Variablen ja auch "dereferenzieren" kann und durch die Übergabe von Zeigern als Parameter auch ein "call by reference" simuliert wird

    Da wird nichts simuliert. Mit reference ist hier eine allgemeine Referenz gemeint, also ein Verweis auf ein Objekt. Referenzen sind auch nur konstante Zeiger mit Syntaxzucker. Sie bieten eine Referenzierung an, die sicher ist.
    Schließlich gibt es in wohlgeformten C++-Programmen keine Null-Referenzen, der Check entfällt. Beides hat Vor- und Nachteile und wird gleichermaßen genutzt.


Anmelden zum Antworten