Kurze Frage zu Get Methoden



  • Hallo zusammen,
    hätte es irgendwelche Nachteile, wenn ich all meine Get-Methoden gleich als const deklariere, auch wenn ich erstmal kein const Objekt erzeuge? Falls ich das aber mal machen möchte, dann gibt es keine Probleme.

    Spricht irgendwas dagegen oder muss ich irgendwas beachten?

    Vielen Dank
    lg, freakC++



  • Methoden, die das Objekt nicht verändern, sollten immer als const deklariert werden. Es spricht also alles dafür die Getter const zu machen.



  • Ok, dann werde ich mein Verhalten mal ändern.

    Angenommen man macht es nicht, kann denn bei einfachen Get Methoden, die wirklich nur eine Variable zurückgeben, was passieren oder schieflaufen?

    Ich werde solche Methoden nun trotzdem als const deklarieren.

    lg, freakC++



  • das const bei Member-Funktionen sagt lediglich aus, dass Member selbst über diese nicht verändert werden dürfen (Außnahmen bezüglich mutable jetzt mal außen vor).
    Bei gettern ist das durchaus sinnig und sollte bezüglich const correctnes auch gemacht werden.



  • Ok, mein Buch sagt nämlich, dass "für jede Elementfunktion zwei Versionen geschrieben werden: Eine Read-Only-Version, die automatisch für ein konstantes Objekt aufgerufen wird, und eine "normale" Versione, die dann für nicht konstante Objekte aufgerufen wird".

    Das sehe ich jedoch nicht so. Ich würde dann nur eine const Methode machen. Warum sollte ich zwei Getter machen und eine davon als const deklarieren!?

    Vielen Dank
    lg, freakC++



  • Ok, mein Buch sagt nämlich, dass "für jede Elementfunktion zwei Versionen geschrieben werden: Eine Read-Only-Version, die automatisch für ein konstantes Objekt aufgerufen wird, und eine "normale" Versione, die dann für nicht konstante Objekte aufgerufen wird".

    Lange keinen solchen Unsinn mehr gelesen.
    Bist du sicher, dass das so in der Form dasteht? Wenn ja, was ist das für ein Buch?
    Es ist zwar möglich, das zu machen, aber Sinn macht es selten.

    Bei der Implementation eines Container macht z.B. folgendes Sinn:

    T& operator[](int index) {return interalArray[index];}
    const T& operator[](int index) const {return interalArray[index];}
    

    So kannst du operator[] auf konstante und nicht-konstante Container anwenden und trotzdem die Elemente im ersten Fall verändern.



  • Das macht schon Sinn, aber natürlich nur für bestimmte Typen. In dem Fall nämlich bei Containern. Schau dir einfach mal die at()-member von std::vector an. Oder der []-Operator von std::vector und std::map. Da wird genau das so gemacht, wie in deinem Buch beschrieben.

    Aber das man über eine solche Memberfunction direkt ein Membervariable ändern darf, sollte nur für Container-ähnliche Typen gelten. Bei sonstigen Typen, sollte die Kapselung gewahrt bleiben.



  • Hallo,
    ja, das steht genau in meinem Buch (deswegen als Zitat). Ich habe das Buch "C++ lernen und professionell anwenden".

    Das mit den Containern kann hier jedoch nicht der Fall sein, da sie noch gar nicht durchgenommen werden. Nun ja, das Buch ist eigentlich ganz in Ordnung nur hin und wieder stolper ich über Aussagen, die ich nicht ganz verstehe ;).

    lg, freakC++


Anmelden zum Antworten