Referenzen in Funktionen



  • Hi,
    warum meckert der Kompiler nicht bei dem Aufruf der Funktion "add(i)"? Gefordert ist doch laut Deklaration / Definition eine Referenz. Ich gebe ihm aber nur einen normalen int wert?!!?

    #include <iostream>
    
    using namespace std;
    
    // Deklaration
    int add(int&);
    
    // Definition
    int add(int &x){
    	x++;
    	return x;
    }
    
    int main(void){
    
    	int i(0);
    
    	for (int y(0); y < 10; y++){
    		add(i);
    		cout << i << endl;
    	}
    
    	return 0;
    }
    


  • Mein Kompiler "MinGW" meckert nicht....

    Warum sollte er auch?

    Mach daraus mal:

    int i(0);
    
    int i = 0;
    

    Gruß,
    CSpille



  • Naja, sein Compiler meckert ja auch nicht. Das ist es wohl was ihn verwirrt! 😉

    Beim Aufruf von add übergibst du ja eine Referenz und zwar auf i.



  • Verstehe nicht so ganz was dein Problem ist.
    Letzlich bewirkt die Referenz nur, dass er sich innerhalb der Methode keine Kopie des übergebenen Objektes erstellt sondern das übergebene Objekt selbst verändert.



  • Hi Laines,

    ich kann Deine Verwirrung ein wenig verstehen. Du hast gedacht, dass nur Folgendes geht:

    int main(void){
       int i(0);
       int& ri = i; // (*)
    
       add(ri);
    ...
    

    Stimmt's ?

    Aber merk Dir einfach: (*) macht der Compiler für Dich.
    Da ist auch ein Unterschied zu Zeigern in C++: Da Referenzen (im Gegensatz zu Zeigern) keine echten Variablen sind, kann der Compiler sie direkt durch die "referenzierten Objekte" ersetzen.
    Hakelig wird's in folgenden Situationen:

    int add(int&); 
    int add(int); // ohne &
    int ref_add(int&);
    
    int main() {
       int i = 2;
       add(i); // Compiler error: un-eindeutiger Aufruf; weiß nicht, welches er nehmen soll
       ref_add(2); // Compiler error: An einen Literal (2) kann er nur const& binden
       add(2); // ist eindeutig, weil ja add(int&) nicht geht
    

    Gruß,

    Simon2.



  • Simon2 schrieb:

    Hi Laines,

    ich kann Deine Verwirrung ein wenig verstehen. Du hast gedacht, dass nur Folgendes geht:

    int main(void){
       int i(0);
       int& ri = i; // (*)
    
       add(ri);
    ...
    

    Stimmt's ?

    Stimmt! 👍

    Danke für die ausführliche Erklärung! 🙂



  • Simon2 schrieb:

    Hakelig wird's in folgenden Situationen:

    int ref_add(int&);
    ...
    ref_add(2);
    

    außer du bastelst dir einen rvalue-to-lvalue cast.



  • queer_boy schrieb:

    ...außer du bastelst dir einen rvalue-to-lvalue cast.

    "Eins nach dem Anderen, mein junger Padawan ! Eins nach dem Anderen !" 😉

    Gruß,

    Simon2.


Anmelden zum Antworten