Referenzen und Zeiger



  • Hey,
    vielen Dank für die ausführlichen Erklärungen. Ich denke, dass ich es verstanden habe. Falls dennoch Fragen wieder aufkommen sollte, dann werde ich mich melden!

    Bis dann
    lg, freakC++



  • Hallo zusammen,
    da bin ich nochmals. Ich habe nochmal eine Frage zu diesem Aufruf:

    int& max(int x, int y)
    {
     return x > y ? x : y;
    }
    

    Warum wird hier der Compiler eine Fehlermeldung ausgeben. Kann man überhaupt noch einen Rückgabetyp einer Funktion vom Typ "Referenz auf Typ" machen? Könnt ihr mir das nochmals an einem guten Beispiel erläutern?

    Vielen Dank
    lg, freakC++



  • freakC++ schrieb:

    int& max(int x, int y)
    {
     return x > y ? x : y;
    }
    

    Das klappt nicht, weil x eine lokale Variable innerhalb der Funktion ist und totgeht, wenn die Funktion verlassen wird. Eine referenz auf was totes ist nicht gut.

    int& max(int& x, int& y)
    {
     return x > y ? x : y;
    }
    

    So wäre erzwungen, daß der Aufrufer Referenzen auf außen lebende Variablen reinsteckt und eine Referenz auf eine dieser außen lebenden Variablen zurückzugeben, istr ok.



  • Hallo,
    das leuchtet mir zwar ein, doch dann verstehe ich dieses Beispiel nicht 😃 :

    string& message() 
    { 
     static string str = "Hallo"; 
     return str; 
    }
    
    int main()
    {
    	string str = message();
    	cout << str << endl;
    	return 0;
    }
    

    Dieses Beispiel hatten wir zwar schonmal, aber egal. Wenn ich nun das static wegmache, wird str auch zu einer lokalen Variable. Wenn man mal vom Logischen absieht: Das Programm wird auch ohne static kompiliert. Warum kompiliert dann das andere Beispiel nicht. Da sind doch auch "nur" lokale Variablen?!

    Vielen Dank
    lg, freakC++



  • Grundsätzlich kompiliert auch das obige Beispiel. Benenn es einfach mal um. 😉

    Das liegt daran, dass max ein Makro ist und dann bekommt der Compiler da ein sehr merkwürdiges Konstrukt vorgelegt. 😉


  • Mod

    freakC++ schrieb:

    Hallo zusammen,
    da bin ich nochmals. Ich habe nochmal eine Frage zu diesem Aufruf:

    int& max(int x, int y)
    {
     return x > y ? x : y;
    }
    

    Warum wird hier der Compiler eine Fehlermeldung ausgeben.

    Warum sollte er?



  • camper schrieb:

    freakC++ schrieb:

    Hallo zusammen,
    da bin ich nochmals. Ich habe nochmal eine Frage zu diesem Aufruf:

    int& max(int x, int y)
    {
     return x > y ? x : y;
    }
    

    Warum wird hier der Compiler eine Fehlermeldung ausgeben.

    Warum sollte er?

    neben dem von drakon vermuteten fakt, dass es ein max-makro gibt, gibts auch noch die möglichkeit, dass er algorithm included hat und using namespace std geschrieben hat - dann wird vermutlich kommen, dass man fkt. nicht mittels rückgabe-typ überladen kann...

    bb


  • Mod

    unskilled schrieb:

    neben dem von drakon vermuteten fakt, dass es ein max-makro gibt

    achso, dafür gibts NOMINMAX.

    unskilled schrieb:

    gibts auch noch die möglichkeit, dass er algorithm included hat und using namespace std geschrieben hat - dann wird vermutlich kommen, dass man fkt. nicht mittels rückgabe-typ überladen kann...

    Stimmt, allerdings stehen in std nur zwei Funktionstemplates für max, kein Problem also.



  • camper schrieb:

    unskilled schrieb:

    neben dem von drakon vermuteten fakt, dass es ein max-makro gibt

    achso, dafür gibts NOMINMAX.

    im nachhinen gibts dafür nur noch #undef min bzw #undef max, da jeder, der die windows-header included, NOMINMAX davor definieren müsste - machen aber die wenigsten (libs)... würd ich mich auch nie drauf verlassen...

    camper schrieb:

    unskilled schrieb:

    gibts auch noch die möglichkeit, dass er algorithm included hat und using namespace std geschrieben hat - dann wird vermutlich kommen, dass man fkt. nicht mittels rückgabe-typ überladen kann...

    Stimmt, allerdings stehen in std nur zwei Funktionstemplates für max, kein Problem also.

    stimmt ^^

    bb



  • Hallo zusammen,
    jetzt hab' ich es begriffen. Der Code kompiliert nun auch.

    Bis bald
    lg, freakC++


Anmelden zum Antworten