Beispiel für Call by value und Call by reference



  • Hallo,

    könnte mir jemand bitte ein gutes Beispiel für callbyvalue und callbyreference reinschreiben und erklären?

    Ich versteh das einfach nicht... 🙂

    Schonmal danke im Vorraus!



  • Klar:

    int main(void)
    {
    	int var1 = 2, var2 = 2;
    	quad1(var1);		// keine Änderung von var1
    	quad2(var2);		// var2 wird verändert, da Übergabe per Referenz
    
    	return 0;
    }
    
    	// Call by value
    void quad1(int a)
    {
    	a = a*a;
    }
    
    	// Call by reference
    void quad2(int &a)
    {
    	a = a*a;
    }
    

    Bei der Funktion quad1() wird nur eine Kopie der übergebenen Variable an die Funktion übergeben. Änderungen haben daher keine Auswirkung auf die tatsächliche übergebene Variable.

    ph4nt0m



  • Und was wäre die ausgabe bei:

    #include <iostream>
    using namespace std;
    
    int main(void)
    {
        int var1 = 2, var2 = 2;
        quad1(var1);        // keine Änderung von var1
        quad2(var2);        // var2 wird verändert, da Übergabe per Referenz
    
        return 0;
    }
    
        // Call by value
    void quad1(int a)
    {
        a = a*a;
        cout<<a<<" * "<<a<<" = "<<a*a<<endl;
    }
    
        // Call by reference
    void quad2(int &a)
    {
        a = a*a;
        cout<<a<<" * "<<a<<" = "<<a*a<<endl;
    }
    
    2 * 2 = 4
    2 * 2 = 4
    

    Oder kommt da was anderes raus?



  • Das ist schon richtig. Call by value/reference bezieht sich aber auf die Variablen die du der Funktion übergibst, hier also var1/var2 in der main-Funktion!

    #include <iostream>
    using namespace std;
    
    int main(void)
    {
    	int var1 = 2, var2 = 2;
    	quad1(var1);	// var1 wird hier nur scheinbar quadriert, siehe Ausgabe unten
    	quad2(var2);
    
    	cout << "2*2 = " << var1 << endl;
    	cout << "2*2 = " << var2 << endl;	
    
    	return 0;
    }
    
    	// Call by value
    void quad1(int a)
    {
    	a = a*a;
    }
    
    	// Call by reference
    void quad2(int &a)
    {
    	a = a*a;
    }
    

    Die Ausgaben sind unterschiedlich, obwohl der Rumpf der beiden Methoden exakt identisch ist.

    ph4nt0m



  • #include <iostream> 
    using namespace std; 
    
    int main(void) 
    { 
        int var1 = 2, var2 = 2; 
        quad1(var1);        // keine Änderung von var1 
        quad2(var2);        // var2 wird verändert, da Übergabe per Referenz
    
        std::cout << var1 << std::endl; // 2
        std::cout << var2 << std::endl; // 4
    
        return 0; 
    } 
    
        // Call by value 
    void quad1(int a) 
    { 
        a = a*a; 
    } 
    
        // Call by reference 
    void quad2(int &a) 
    { 
        a = a*a; 
    }
    

    Es geht nicht um die internen Variablen, sondern um die Variablen, die beim Aufruf übergeben werden ⚠

    EDIT: Ah, konnte meinen Beitrag nicht abschicken und bin deshalb 5 sec zu spät 😃

    Gruß
    Don06



  • /* * * * * * * * * * * * * * * * * * * */
    /*       Wenn ich den Code so          */
    /*     Compile, bekomme ich die        */
    /*          Fehlermeldung:             */
    
    // Error: Ungelöste externe 'quad2(int)' referenziert von
    // C:\DOKUMENTE UND EINSTELLUNGEN\DARKNESS\EIGENE DATEIEN\C++\NEW\CALLBYREF2\WINDOWS\DEBUG_BUILD\CALLBYREF2.OBJ
    
    #include <iostream>
    using namespace std;
    
    void quad1(int a);
    void quad2(int a);
    
    int main(void)
    {
        int var1 = 2, var2 = 2;
        quad1(var1);    // var1 wird hier nur scheinbar quadriert, siehe Ausgabe unten
        quad2(var2);
    
        cout << "2*2 = " << var1 << endl;
        cout << "2*2 = " << var2 << endl;
    
        return 0;
    }
    
        // Call by value
    void quad1(int a)
    {
        a = a*a;
    }
    
        // Call by reference
    void quad2(int &a)
    {
        a = a*a;
    }
    


  • Hi,

    das liegt daran, dass das...

    void quad2(int a); // Zeile 13
    

    ...und das...

    void quad2(int [b]&[/b]a) // Zeile 35
    {
        a = a*a;
    }
    

    ...zwei unterschiedliche Dinge sind.



  • void quad2(int a) != void quad2(int &a)
    

    😉


Anmelden zum Antworten