Wozu schreibt man vor einer Funktion welchen Datentyp es zurückgibt?



  • Cybertec schrieb:

    CppLearner schrieb:

    function halloWelt(){
    cout << "Hallo Welt"
    }

    Wie einer bereits sagte, kann man ja Funktionen mit gleichem Namen überladen, und ausserdem ist dein Beispiel nicht gerade Vorteilhaft, da es hier gar keinen Rückgabe gibt.

    Man kann Funktionen sowieso nicht nur nach dem Rückgabetyp überladen.



  • qweasdyxc schrieb:

    Man kann Funktionen sowieso nicht nur nach dem Rückgabetyp überladen.

    Das hab ich auch nicht geschrieben.



  • qweasdyxc schrieb:

    Man kann Funktionen sowieso nicht nur nach dem Rückgabetyp überladen

    Um genau zu sein, kann man Funktionen nicht nach Rückgabetyp überladen, nur nach Parametern.

    CppLearner schrieb:

    Ich meine, ob die Funktionen einen String, Ganzzahl, oder gar nichts ausgibt, sollte doch klar sein

    Nur mal zur Klarstellung: Ausgeben != Zurückgeben!

    Um zu deiner Frage zu kommen: C++ ist nunmal eine statisch typisierte Programmiersprache, deshalb muss man auch den Rückgabetyp angeben. Man kann ja auch Funktionen nur bekanntmachen, wie Skym0sh0 schon gesagt hat, ohne dass man den eigentlichen Code der Funkttion angibt.
    Außerdem ist es ja auch so, dass man in C++ Funktion nur werden kann wenn sie vorher bekannt sind. Und wenn der Compiler den Funktionsbody noch nicht kompiliert hat, weil er danach kommt, woher soll er dann wissen welchen Typ die Funktion hat ?
    Mal ganz Angesehen von Sachen wie "return 0", was alles mögliche darstellen kann. Welchen Typ gibst du da zurück ?



  • DarkShadow44 schrieb:

    Mal ganz Angesehen von Sachen wie "return 0", was alles mögliche darstellen kann. Welchen Typ gibst du da zurück ?

    Integer-Literale ohne Suffix sind doch standardmäßig ints.



  • DarkShadow44 schrieb:

    Mal ganz Angesehen von Sachen wie "return 0", was alles mögliche darstellen kann. Welchen Typ gibst du da zurück?

    0 ist vom Typ int. Und Compiler müssen eh schon wissen welchen Typ ein beliebiger Ausdruck hat, weil es decltype gibt.

    auto func(){
        return irgendwas;
    }
    //wird vom compiler umgeschrieben in
    decltype(irgendwas) func(){
        return irgendwas;
    }
    

    Die Frage, warum man überhaupt Rückgabewerte an Funktionen ranschreiben muss ist überhaupt nicht trivial, denn in den meisten Fällen ist es nämlich unnötig redundant.

    Natürlich gibt es Fälle, wo es nicht eindeutig ist, welcher Rückgabewert gemeint ist, dann muss man es halt hinschreiben, aber ansonsten sollte man das nicht müssen.

    Genau deshalb gibt es ja die Neuerungen in C++, die dieses Defizit reparieren.



  • DarkShadow44 schrieb:

    qweasdyxc schrieb:

    Man kann Funktionen sowieso nicht nur nach dem Rückgabetyp überladen

    Um genau zu sein, kann man Funktionen nicht nach Rückgabetyp überladen, nur nach Parametern.

    [/quote]

    Das habe ich doch gesagt. Ersetze 'nur' durch 'ausschließlich' 🙂



  • Ethon schrieb:

    Integer-Literale ohne Suffix sind doch standardmäßig ints.

    Ah stimmt, Denkfehler. 🙄

    nwp3 schrieb:

    Die Frage, warum man überhaupt Rückgabewerte an Funktionen ranschreiben muss ist überhaupt nicht trivial, denn in den meisten Fällen ist es nämlich unnötig redundant.

    Naja, z.B. wenn man eine externe lib hat die nur aus DLL + Header besteht muss man die Typen angeben.

    Und ob sowas wie

    auto func2();
    auto func()
    {
        return func2();
    }
    auto func2()
    {
        return irgendwas;
    }
    

    funktioniert kann ich leider nicht sagen, hab keinen C++14 Compiler zur Hand.

    Wobei es meiner Meinung nach auch Vorteile hat wenn man den Typ der Funktion leicht erkennen kann, wenn alles nur voll mit "auto" ist kann das auch schnell unübersichtlicher werden, zumindest für einfache Typen.



  • @DarkShadow44~~
    Natürlich geht das nicht.
    Du kannst eine Funktion nur mit Returntyp auto deklarieren, wenn sie gleichzeitig auch definiert wird.
    Da du die Funktion aber erstmal nur deklarieren willst, ohne Definition, kannst du nicht [c]auto[/c] als Returntyp verwenden.~~
    EDIT: siehe unten


  • Mod

    Du kannst eine Funktion nur mit Returntyp auto deklarieren, wenn sie gleichzeitig auch definiert wird.

    Völlig falsch.

    funktioniert kann ich leider nicht sagen, hab keinen C++14 Compiler zur Hand.

    Brauchst du auch nicht, nur den Standard, der nämlich sagt, dass eine nur deklarierte Funktion dieser Art nicht aufgerufen werden darf, bis sie definiert ist (und der Rückgabewert feststeht).

    §7.1.6.4/11 schrieb:

    If the type of an entity with an undeduced placeholder type is needed to determine the type of an expression, the program is ill-formed.



  • Arcoth schrieb:

    Brauchst du auch nicht, nur den Standard, der nämlich sagt, dass eine nur deklarierte Funktion dieser Art nicht aufgerufen werden darf, bis sie definiert ist (und der Rückgabewert feststeht).

    Ah danke. 🙂
    Bedeutet also, dass man auto nicht verwenden kann wenn die Funktion in einem anderem Sourcefile liegt. Also doch nicht so praktisch, wird man wohl doch meistens noch die Rückgabetypen angeben müssen.



  • Arcoth schrieb:

    Du kannst eine Funktion nur mit Returntyp auto deklarieren, wenn sie gleichzeitig auch definiert wird.

    Völlig falsch.

    Upps, peinlich!
    Danke für die Korrektur.

    Weisst du vielleicht wofür es dann überhaupt erlaubt ist die Funktion zu deklarieren? Mir fällt gerade nix ein was man damit machen könnte, was nicht auch ginge wenn die Deklaration ganz verboten wäre.



  • auto f1();
    
    auto f2(){
        return f1(); //klappt nur wegen deklaration
    }
    
    auto f1(){
        return 42;
    }
    


  • nwp3 schrieb:

    auto f1();
    
    auto f2(){
        return f1(); //klappt nur wegen deklaration
    }
    
    auto f1(){
        return 42;
    }
    

    Nö, klappt nicht. Der Rückgabewert von f2 kann nicht bestimmt werden.


  • Mod

    Weisst du vielleicht wofür es dann überhaupt erlaubt ist die Funktion zu deklarieren? Mir fällt gerade nix ein was man damit machen könnte, was nicht auch ginge wenn die Deklaration ganz verboten wäre.

    Nein. 🙂 Ich meine, wie jede Deklaration bringt es einen neuen Namen in den Scope. Vielleicht kann man sich den Namen so im Voraus "reservieren", aber das ist schon an den Haaren herbeigezogen.

    Andererseits sind auch nicht lokale Funktionsdeklarationen verboten...


Anmelden zum Antworten