const und Klassen
-
Hi,
ich versuche mich gerade an das Thema const ranzutasten.
Jetzt steht in meinem Buch, dass ich Instanzmethoden als const auszeichnen soll, wenn diese den Objektstatus der Instanz nicht ändern.
Das ist doch eigentlich bei getter-Methoden die einen Wert zurueckliefern immer der Fall.
Wie sieht es mit zurueckgelieferten Referenzen aus, sagen wir ich habe ein Attribut userName und der getter ist kein Problem, ich gebe den string als Referenz zurück, es existiert aber auch eine setUserName()-Methode - ich habe also nichts dagegen, wenn diese String-Instanz irgendwann im Programm geändert wird und wenn dieser String gar als Parameter meiner setUserName()-Methode auftritt und dann ja den Objektzustand meiner Gesamtinstanz ändert.
Wann vergebt ihr das const bei einer Methode?
Wann vergebt ihr const als Rückgabetyp bei einer Methode?
Wann vergebt ihr const beim Parameter einer Methode?Danke vorab.
-
Immer das logische const.
-
Wenn du eine Referenz zurück gibst, die selbst nicht const ist, dann ist die Methode auch nicht const. Aber so etwas sollte man eigentlich nicht machen (dann kann man den Member auch gleich public machen).
Wann vergebt ihr das const bei einer Methode?
Wenn die Methode das Objekt nicht ändert, dann sollte die Methode const sein. Nach Möglichkeit sollte jede Methode, die das Objekt nicht offensichtlich ändert const sein (für interne Buffer etc. gibt es ja mutable)
Wann vergebt ihr const als Rückgabetyp bei einer Methode?
Wann vergebt ihr const beim Parameter einer Methode?Wenn es sich um Referenzen handelt, die konstant sein sollen (also wenn die Referenzen nur dazu dienen, dass unnötiges Kopieren vermieden wird)
-
Jay1980 schrieb:
Wann vergebt ihr das const bei einer Methode?
Wann vergebt ihr const als Rückgabetyp bei einer Methode?
Wann vergebt ihr const beim Parameter einer Methode?Danke vorab.
Ich konnte dir nicht ganz folgen, aber um die Fragen zu beantworten:
-Wenn Instanzen/Variablen oder Objekte der Klasse nicht verändert werden
-Wenn der Rückgabetyp später nicht verändert werden soll (!?)
-Selbiges, wenn die Parameter halt nicht verändert werden sollen...
-
Jay1980 schrieb:
Wie sieht es mit zurueckgelieferten Referenzen aus
So:
const std::string& name() const { return name_; } std::string& name() { return name_; }Setter werden damit unnötig.
-
constdevil schrieb:
Setter werden damit unnötig.
Kapselung auch.
-
Hi, also so sollte es passen, sofern ich die Kapselung beibehalten will, wenn ich euch richtig verstanden habe ...
const std::vector<std::string>& Properties::getAminoAlphabet() const { return this->aminoAlphabet; }
-
Ja, wobei Container-Rückgabe wieder ein Thema für sich ist. Manchmal kann es sinnvoller sein, vom genauen Containertypen zu abstrahieren. Alternativen sind Paare von
begin()- undend()-Iteratoren in der Schnittstelle, Range, Output-Iterator, Visitor, ...Aber direkt einen Container zurückgeben ist manchmal ganz praktisch.