Frage zu Call by Reference



  • Hallo ich habe folgendes Programm geschrieben welches einen Wert per Referenz an die Funktion übergibt:

    #include <iostream>
    using namespace std;
    
    int add(int &z1);
    
    int main(int argc, char* argv[])
    {
    int func;
    int ez1;
    
    cout<<"eingabe: ";
    cin>>ez1;
    
    func = add(ez1);
    
    cout<<func;
    
    system("PAUSE");
    }
    
            int add(int &z1)
            {
            int erg;
    
            erg = z1 + 2;
    
            return erg;
            }
    

    Nun mein Frage wo ist da jetzt der Unterschied ob ich Call by reference oder Called by value mache ?

    Unser Lehrer hat uns nur kurz erklärt was das ist und wie das geht.

    Aber er hat nicht erklärt wofür was ist -.-

    Also wann benutz man Call by reference und wann Call by value ?



  • int add(int &z1)
            {
            z1 = z1 + 2;
    
            return z1
            }
    

    das tat er meinen, tu ich denken.
    da machts einen unterschied.



  • Ahja Volkard ... ähm NEXT xD

    Ob ich es jetzt so mache:

    int add(int &z1)
            {
            z1 = z1 + 2;
    
            return z1 ;
            }
    

    oder so:

    int add(int z1)
            {
            int erg;
            erg = z1 + 2;
    
            return erg ;
            }
    

    Wo ist da nun der Unterschied ausser das ich bei der 2ten Variante mehr Code schreibe ...



  • int main(int argc, char* argv[]) 
    { 
    int func; 
    int ez1; 
    
    cout<<"eingabe: "; 
    cin>>ez1; 
    
    func = add(ez1); 
    
    cout<<func<<' '<<ez1<<'\n'; //geändert!
    
    system("PAUSE"); 
    }
    

    der unterschied ist, daß ez1 verändert worden ist, wenn das ein referenzparameter war.
    aber als value-arameter bleibt ez1 heile.



  • Naja der Unterschied ist, dass du nochmal extra Speicher für eine unnötige Variable anforderst. Außerdem übergibst du bei dem 1. Beispiel das Original und im 2. eine Kopie.



  • 1.) Also du solltest, wenn du den Parameter nicht ändest, und nicht per Value übergeben möchtest, die Referenz schon immer const machen...

    2.) Lohnt sich die Übergabe per const Ref, wenn der Typ nicht kopiert werden kann und ab einer Größe, die nicht mehr in ein Register passt (bei x86 also ab >4Byte, bei x64 ab >8Byte)

    3.) Übergibt man nicht per Value sondern per referenz (bzw pointer, wenn auch NULL möglich sein soll), wenn man den Parameter ändern möchte und den geänderten dann wiederhaben möchte - (schlechtes) Bsp.:

    size_t Send (std::string &tosend)
    {
     //versuchen, "tosend" komplett zu senden - wenn das nicht klappt, dann gib die gesendeten Bytes zurück und schneide bei tosend das ab, was schon gesendet wurde
    }
    

    bb


Log in to reply