const trhow() nach Methode



  • hey kann mir jemand sagen was folgende zeile macht?

    virtual const char* what() const throw() {
    ...
    }
    

    also im speziellen das const throw() nach der eigentlichen methode.... is das ein aufruf?



  • das heist nicht const throw(); Korrekt Zerteilt liest man das so:

    virtual | const char* | what() | const | throw()
    

    Und das bedeutet:

    Virtuelle Funktion | Rückgabewert ein const Zeiger auf char | Funktionsname what() | die Funktion verändert keine Klassenvariablen | diese Funktion darf keine Exception werfen, das ist ein Check, wirft sie doch eine stürzt das Programm ab.



  • thx



  • Xebov schrieb:

    ...Rückgabewert ein const Zeiger auf char...

    Der Rückgabewert ist ein Zeiger auf const char, und nicht ein const Zeiger auf char.



  • nein. das const besagt, dass die MEthode das Objekt nicht verändert. Wenn du ein Objekt als const deklarierst, kannst du nur Methoden aufrufen, die auch als const deklarert wurden.
    throw() ist eine Exceptionspezifikation und bedeutet, dass du behauptest dass die Methode keine Exceptions wirft. Das bedeutet gleichzeitig, dass der Compiler garantieren muss, dass das auch eingehalten wird. Oft wird das fehlinterpretiert als "ich schreib throw() dran und kann mir danach sicher sein dass da nichts kommt".
    Resultat von Exceptionspezifikationen ist allgemein folgendes:
    Wenn der Compiler zur Compilezeit garantieren kann, dass die in der Funktion aufgerufenen Funktionen keine Exeptions schmeißen können, dann lässt ers einfach so stehen. Garantieren kann er das nur, wenn ausschließlich triviale Operationen vorkommen (Zuweisungen von PODs usw.) und alle nichttrivialen Operationen selber eine entsprechende Spezifikation haben (weil er dann schon für die garantieren musste dass sie die Spezifikation erfüllen).
    Wenn er das zur Compiezeit nicht garantieren kann (weil er es für eine aufgerufene Funktion nicht garantieren konnte), dann muss er zur Laufzeit prüfen ob nicht doch eine exception fliegt und in dem Fall std::unexpected() aufrufen. Das erzeugt noch zusätzlichen Code, weswegen im Allgemeinen davon abgeraten wird, Exception Spezifikationen zu nutzen (Ausnahmen sind Destruktoren, Deallokatoren und swap-Funktionen, die allgemein keine Exceptions werfen sollten).


Anmelden zum Antworten