const correctness verständis
-
hallo,
was hat es mit dem ganzen const auf sich? const correctness etc. ich kenne const nur als bezeichner um eine variable nicht änderbar zu machen. sprich:
const int x = 34225; //entspricht fast #define x 34225was kann man mit const noch machen und wofür
gruß :xmas1:

-
Mit const correctness Bezeichnet man die "Vereinbarung" Referenzen oder Pointer auf Variablen die man nicht verändert als reference to const T bzw. pointer to const T zu nehmen. Heißt:
void print_string(const char* s); void print_string(const std::string& s);Das Dokumentiert dem Aufrufer bereits im Code, dass diese Funktion die übergebende Variable nicht verändern wird, auch wenn sie es prinzipiell könnte. Dem Implementierer der Funktion gibt es zusätzlich die Hilfestellung, dass es einen Compilerfehler gibt wenn er doch versucht das (ohne Cast) zu tun. "Dokumentation" und das was passiert sind so also einigermaßen fest gekoppelt, sodass man Flüchtigkeitsfehler vermeiden kann. const correctness heißt nicht:
void foo(const int i);Hier wird eine Kopie angelegt und die ursprüngliche Variable kann eh nicht verändert werden. Das const gibt dem Aufrufer also keine zusätzliche Information. Es könnte zwar als eine Art Hilfe für den Implementierer gesehen werden, aber bei Parametern lässt man das const an der Stelle üblicherweise weg.
Nicht statische Methoden können zusätzlich als "const" deklariert werden.
struct S { void foo() const {} };Das macht nichts anderes, als this zu einem const T* zu zaubern. Somit kann das Objekt von dieser Methode nicht verändert werden. (Statische Methoden arbeiten ja nicht auf einem Objekt (haben kein this), deshalb wäre das da sinnlos.)
PS: Steht das eigentlich schon in den FAQ?
-
Methoden können const sein.
class foo { public: void foo() const; // verändert das Objekt nicht void bar(); // verändert das Objekt möglicherweise void baz(const std::string& r); // kann r nicht verändern private: int i; };in foo darfst du jetzt nichts machen, was i verändert. Das klingt jetzt einfach, aber wenn du eine komplexe Datenstruktur hast muss diese ebenfalls konstanten Methoden für sich anbieten, damit du die in dieser Methode nutzen kannst.
Auch Parameter sind ein wichtiger Punkt. Vor allem wenn es Referenzen oder Zeiger sind. Der Aufrufer weiss, dass der string, den er an baz übergibt von dieser Methode nicht verändert wird, was ohne das const nicht klar ist.
-
drakon schrieb:
const; // verändert das Objekt nichtDas war einmal so in C++98.
http://channel9.msdn.com/posts/C-and-Beyond-2012-Herb-Sutter-You-dont-know-blank-and-blank
-
drakon schrieb:
Methoden können const sein.
class foo { public: void foo() const; // verändert das Objekt nicht void bar(); // verändert das Objekt möglicherweise void baz(const std::string& r); // kann r nicht verändern private: int i; };in foo darfst du jetzt nichts machen, was i verändert. Das klingt jetzt einfach, aber wenn du eine komplexe Datenstruktur hast muss diese ebenfalls konstanten Methoden für sich anbieten, damit du die in dieser Methode nutzen kannst.
Auch Parameter sind ein wichtiger Punkt. Vor allem wenn es Referenzen oder Zeiger sind. Der Aufrufer weiss, dass der string, den er an baz übergibt von dieser Methode nicht verändert wird, was ohne das const nicht klar ist.
Kann foo() nichts mehr ändern oder "sollte" foo() nichts mehr ändern?
-
Sollte. Mit Casts geht alles was das Typsystem hergibt.
-
Ok, ja. Wenn man da drin keine komischen Sachen macht, dann wird das nicht verändert. Schlimme Dinge kann man natürlich immer anstellen. Mit
mutableist das auch so eine Sache.Aber ich sag mal, wenn man normalen Code schreibt und es nicht absichtlich machen möchte, dann bleibt const const.
//Edit
@blankochek: Danke für den Link. War sehr interessant.
-
blankochek schrieb:
Das war einmal so in C++98.
http://channel9.msdn.com/posts/C-and-Beyond-2012-Herb-Sutter-You-dont-know-blank-and-blank
Nettes Video, danke!

-
const ist doch eher noch dafür da um programmierfehler vorzubeugen, bis jetzt nur as flüchtigkeitsfehler angeprangert.
jegliche konstanten const machen und bei programmierfehlern springt der compiler an