Zeiger vs Referenz
-
Hi,
folgender Code:
class Foo { A* zeigerA; shared_ptr<B> bPtr; A* methodA() const { return zeigerA; } // das geht, trotz const shared_ptr<B>& methodB() const { return bPtr; } // das geht nicht };Wieso ist hier methodA() in Ordnung, obwohl die Methode const ist? Ich kann doch über den Rückgabewert dann das auf was zeigerA zeigt ändern.
Und wieso ist methodB() NICHT gültig:
Error: Qualifiers dropped in binding reference of type shared_ptr<B>& to initializer of type const shared_ptr<B>
Wieso klappt die Rückgabe bei method(), hier aber nicht (sind ja beide const)?
-
Es fehlt noch die Referenz auf den Zeiger
A*& methodC() const { return zeigerA; }
-
A gibt eine Kopie zurück und B eine Referenz. Der Typ der Member spielt keine Rolle und auch nicht, worauf die zeigen.
-
ButtermilchMH schrieb:
Wieso ist hier methodA() in Ordnung, obwohl die Methode const ist? Ich kann doch über den Rückgabewert dann das auf was zeigerA zeigt ändern.
Weil du eine Kopie des internen Zeigers zurück gibst, den zeiger also nicht verändern kannst. Dass das Objekt, auf das der Zeiger zeigt, verändert werden kann, hat damit nichts zu tun, weils nicht Bestandteil des Objektes ist.
Und wieso ist methodB() NICHT gültig:
Weil du eine Referenz auf ein idrektes Element des Objekts zurückgibst und es über diese Referenz ändern könntest. Das würde das const umgehen.
-
pumuckl schrieb:
Und wieso ist methodB() NICHT gültig:
Weil du eine Referenz auf ein idrektes Element des Objekts zurückgibst und es über diese Referenz ändern könntest. Das würde das const umgehen.
Ich dachte das const bei einer Methode heißt nur: "In der Methode ändere ich kein Member". Offenbar bedeutet es also noch mehr?
-
ButtermilchMH schrieb:
Ich dachte das const bei einer Methode heißt nur: "In der Methode ändere ich kein Member". Offenbar bedeutet es also noch mehr?
Vielleich: "Ich ändere keine Member und lasse es auch nicht zu."
-
constbei einer Methode bedeutet, dassthisauf ein Konstantes Objekt zeigt. Das hat den Effekt, dass man keine nicht-konstanten Referenzen auf Member erzeugen kann. Eine solche Referenz braucht man natürlich für Änderungen.Vielleicht hilft ja das (
das hintere [c]const[/c] heißt, dass der Zeiger [c]this[/c] selbst konstant ist):struct Class { int member; void method() { this; //Class * [s]const[/s] this->member; //int & } void method() const { this; //const Class * [s]const[/s] this->member; //const int & } };
-
Nur damit keine Verwirrung entsteht:
TyRoXx schrieb:
nicht-konstanten Referenzen
Referenzen sind immer konstant. Was du meinst, ist eine Referenz auf ein nicht-konstantes Objekt oder kurz "non-const reference".
TyRoXx schrieb:
Vielleicht hilft ja das (das hintere
constheißt, dass der Zeigerthisselbst konstant ist)Ist er aber nicht, da es sich um einen skalaren RValue handelt.
-
Nexus schrieb:
TyRoXx schrieb:
nicht-konstanten Referenzen
Was du meinst, [...] "non-const reference".
Nicht-Konstante Referenz ist also etwas anderes als Non-Const Reference?
-
Nexus schrieb:
TyRoXx schrieb:
Vielleicht hilft ja das (das hintere
constheißt, dass der Zeigerthisselbst konstant ist)Ist er aber nicht, da es sich um einen skalaren RValue handelt.
Und was für einen Unterschied macht das hier?
-
EOutOfResources schrieb:
Nicht-Konstante Referenz ist also etwas anderes als Non-Const Reference?
Nicht-konstante Referenzen existieren in C++ nicht.
Der C++-Standard verwendet die Ausdrücke "non-const reference" für
T&und "const reference" fürconst T&(wobeiTselbst nicht konstant ist).TyRoXx schrieb:
Und was für einen Unterschied macht das hier?
Der Typ von
thisist nichtClass* constoderconst Class* const, sondernClass*bzw.const Class*. Genauso wie der Typ von3nichtconst int, sondernintist.
-
Nexus schrieb:
Nicht-konstante Referenzen existieren in C++ nicht.
Der C++-Standard verwendet die Ausdrücke "non-const reference" für
T&und "const reference" fürconst T&(wobeiTselbst nicht konstant ist).Also übersetzt du "non-const object" mit "nicht-konstantes Objekt" aber "non-const reference" nicht mit "nicht-konstante Referenz"? Ich halte das für Schwachsinn. Wenn der Standard "non-const reference" sagt, dann kann man das doch wohl mit "nicht-konstante Referenz" übersetzten.
-
EOutOfResources schrieb:
Wenn der Standard "non-const reference" sagt, dann kann man das doch wohl mit "nicht-konstante Referenz" übersetzten.
Nein. Der Begriff "nicht-konstante Referenz" ist einfach nur falsch, da gibts nichts zu diskutieren. Referenzen sind per Definition konstant. Dass der Fehler von vielen Leuten begangen wird, macht die Sache keineswegs richtiger.
Du schreibst schliesslich auch
const_iterator, obwohl der Iterator nicht konstant ist. Die Terminologie des C++-Standards hat durchaus ihre Konsistenz – im Gegensatz zu deiner (du sprichst ja auch nicht von "konstantem Zeiger", wenn du das referenzierte Objekt meinst).
-
Aber sprachlich besteht der Unterschied ja darin, dass const nicht das Adjektiv für konstant ist, sondern ein eigener Bezeichner ist. "nicht-konstante Referenz" wäre die Übersetzung für "non-constant reference". Einen deutschen Ausdruck für "non-const reference" erscheint daher schwierig, da "const" einfach nur ein Schlüsselwort ist, das auch keine Übersetzung hat.
Daher wäre die beste deutsche Form, const unübersetzt zu lassen, was zu "nicht-const Referenz" führen würde.