Unterschied zwischen Methoden
-
uzm schrieb:
θWo genau liegt der Unterschied zwischen den vier Methoden?
int getMyVar() { return myVar; }; int getMyVar() const { return myVar; }; const int getMyVar() { return myVar; }; const int getMyVar() const { return myVar; };1. Siehe 2. 3. und 4.
2. Siehe 3. und 4.
3. Die temporäre Variable, die zurückgegeben wird, ist const. Das macht kein Sinn, weil diese per Definition ein r-value ist. Einem r-value kannst du eh nichts zuweisen, also ist const hier sinnlos.
4. Zum einen siehe 3. Zum anderen ist das hier eine Memberfunktion, die const ist, d.h. sie kann die Member des Objekts nicht ändern. Alle Member deines Objekts sind in diese Funktion sozusagen const.
-
Arcoth schrieb:
int getMyVar() { return myVar; }; // Kann von allen Instanzen aufgerufen werden int getMyVar() const { return myVar; }; // Kann nur von konstanten Instanzen aufgerufen werdenDas ist irgendwie verdreht worden.
int getMyVar() { return myVar; }; // Kann nur von nicht-konstanten Instanzen aufgerufen werden int getMyVar() const { return myVar; }; // Kann von allen Instanzen aufgerufen werden
-
out schrieb:
3. Die temporäre Variable, die zurückgegeben wird, ist const. Das macht kein Sinn, weil diese per Definition ein r-value ist. Einem r-value kannst du eh nichts zuweisen, also ist const hier sinnlos.
das gilt nur für built-in-typen. eigenen typen, die du nicht explizit qualifiziert hast, kannst du sehr wohl etwas zuweisen:
http://ideone.com/uzCkCHwenn man den rückgabewert der funktion F (siehe zeile 10) qualifiziert, schlägt die kompilierung fehl:
http://ideone.com/4gJTtGedit:
nwp3 schrieb:
Arcoth schrieb:
int getMyVar() { return myVar; }; // Kann von allen Instanzen aufgerufen werden int getMyVar() const { return myVar; }; // Kann nur von konstanten Instanzen aufgerufen werdenDas ist irgendwie verdreht worden.
int getMyVar() { return myVar; }; // Kann nur von nicht-konstanten Instanzen aufgerufen werden int getMyVar() const { return myVar; }; // Kann von allen Instanzen aufgerufen werdennaja, wenn beide versionen bestehen muss man schon sagen, dass die non-const-methode nur von non-const-instanzen aus und die const-methode nur von const-instanzen aus aufgerufen werden kann. wenn man aus einem non-const-instanz aus die const-methode aufrufen will, muss man casten (cv-qualifier lassen sich auch implizit hinzufügen).
-
asfdlol schrieb:
... und die const-methode nur von const-instanzen aus aufgerufen werden kann. wenn man aus einem non-const-instanz aus die const-methode aufrufen will, muss man casten ...
Äh... Nein? Wenn alle verwirrt sind außer ich, dann heißt das meist, dass ich verwirrt bin. Aber ich behaupte trotzdem mal ihr seid verwirrt. :p
-
nwp3 schrieb:
asfdlol schrieb:
... und die const-methode nur von const-instanzen aus aufgerufen werden kann. wenn man aus einem non-const-instanz aus die const-methode aufrufen will, muss man casten ...
Äh... Nein? Wenn alle verwirrt sind außer ich, dann heißt das meist, dass ich verwirrt bin. Aber ich behaupte trotzdem mal ihr seid verwirrt. :p
asfdlol schrieb:
naja, wenn beide versionen bestehen muss man schon sagen,[...]
damit war gemeint, dass die beiden versionen gleichnamig sind.
edit: so wie es im ursprünglichen listing auch gewesen ist.
-
Arcoth schrieb:
int getMyVar() { return myVar; }; // Kann von allen Instanzen aufgerufen werden int getMyVar() const { return myVar; }; // Kann nur von konstanten Instanzen aufgerufen werden const int getMyVar() { return myVar; }; // Ist dasselbe wie (1), daher eine nicht erlaubte Neudefinition const int getMyVar() const { return myVar; }; // Ist dasselbe wie (2), daher eine nicht erlaubte NeudefinitionDie Parameter von (3) und (4) sind mit denen von (1) bzw. (2) identisch, und die Überladung ist daher verboten.
-
camper schrieb:
Die Parameter von (3) und (4) sind mit denen von (1) bzw. (2) identisch, und die Überladung ist daher verboten.
Es geht um Unterschiede in der Semantik, nicht darum, dass die alle gleichzeitig existieren sollen.
-
asfdlol schrieb:
naja, wenn beide versionen bestehen muss man schon sagen, dass die non-const-methode nur von non-const-instanzen aus und die const-methode nur von const-instanzen aus aufgerufen werden kann. wenn man aus einem non-const-instanz aus die const-methode aufrufen will, muss man casten (cv-qualifier lassen sich auch implizit hinzufügen).
Das ist dann eben inkonsequent. Anders herum gilt es nämlich genauso:
int getMyVar() { return myVar; }; // Kann nur von nicht konstanten Instanzen aufgerufen werden int getMyVar() const { return myVar; }; // Kann nur von konstanten Instanzen aufgerufen werdenWobei das auch nicht stimmt. Nicht die Instanz ist nicht konstant sondern die Referenz oder der Zeiger:
Foo foo; // nicht konstante Instanz const Foo& bar = foo; // konstante Referenz foo.getMyVar(); // getMyVar() ohne const wird aufgerufen bar.getMyVar(); // die Instanz ist nicht konstant und dennoch wird die konstante Methode aufgerufen, da die Referenz konstant ist
-
Wobei das auch nicht stimmt.
Das ist sowieso falsch, siehe oben, da habe ich mich vertüdelt.
Nicht die Instanz ist nicht konstant sondern die Referenz oder der Zeiger:
Völlig egal. Die Instanz wird als konstant behandelt, das ist was zählt.
-
tntnet schrieb:
asfdlol schrieb:
naja, wenn beide versionen bestehen muss man schon sagen, dass die non-const-methode nur von non-const-instanzen aus und die const-methode nur von const-instanzen aus aufgerufen werden kann. wenn man aus einem non-const-instanz aus die const-methode aufrufen will, muss man casten (cv-qualifier lassen sich auch implizit hinzufügen).
Das ist dann eben inkonsequent. Anders herum gilt es nämlich genauso:
int getMyVar() { return myVar; }; // Kann nur von nicht konstanten Instanzen aufgerufen werden int getMyVar() const { return myVar; }; // Kann nur von konstanten Instanzen aufgerufen werdendas verstehe ich nicht. beides nicht. inwiefern das anders herum ist als die von mir gepostete beschreibung sowohl auch inwiefern das nicht konsistent ist.
tntnet schrieb:
Wobei das auch nicht stimmt. Nicht die Instanz ist nicht konstant sondern die Referenz oder der Zeiger:
Foo foo; // nicht konstante Instanz const Foo& bar = foo; // konstante Referenz foo.getMyVar(); // getMyVar() ohne const wird aufgerufen bar.getMyVar(); // die Instanz ist nicht konstant und dennoch wird die konstante Methode aufgerufen, da die Referenz konstant istdas habe ich für denkbar und für implizierbar gehalten. die referenz in deinem listing verweist auf eine konstante instanz. ein zeiger vom typ "
Foo const*" zeigt auch auf eine konstante instanz. ob nun darunter tatsächlich eine top level const-qualified instanz steckt ist irrelevant.edit: ich bin wie gesagt vom fall ausgegangen, dass die unterschiedlich methoden gleichzeitig deklariert sind. dass man - sofern keine konstante überladung vorhanden ist die sich in der parameterliste nicht unterscheidet - die konstante methode auch aus einer nicht-konstanten instanz (oder eben auch aus einem zeiger bzw. aus einer referenz aus, die auf eine nicht-konstante instanz verweist
) aus aufrufen kann ist mir bewusst.
-
Der arme TE...