2010-03-10 7 views

Antwort

24

Jedes Mal, wenn Sie wissen, dass die Methode den Status des Objekts nicht ändert, sollten Sie es als konstant deklarieren.

Es hilft beim Lesen Ihres Codes. Und es hilft, wenn Sie versuchen, den Zustand des Objekts zu ändern - Compiler wird Sie stoppen.

+0

Und wenn die Funktion nicht einmal den Objektstatus berührt, sondern Eingangsargumente in den Rückgabewert reintransformiert, sollte es statisch sein. Static> const member> normales Mitglied. – Lucas

6

Wenn Sie ein const Objekt haben, sind die einzigen Methoden, die der Compiler Sie aufrufen lassen, die durch das Schlüsselwort const als sicher gekennzeichneten Methoden. Tatsächlich sind nur Elementmethoden als const Methoden sinnvoll.

In C++ erhält jede Methode eines Objekts einen impliziten this Zeiger auf das Objekt; Ein const Verfahren wird einfach einen constthis Zeiger erhalten.

3

Angenommen, Sie sprechen über Methoden, wie in:

struct Example { 
    void f() const; 
}; 

Dann, wenn sie auf ein konstantes Objekt aufrufbar sein sollte, sollte das Verfahren const sein.

11

So oft wie möglich. Funktionen, die keine Datenelemente ändern müssen, sollten als const deklariert werden. Dies macht den Code verständlicher und kann dem Compiler Hinweise zur Optimierung geben.

2

Nicht oft genug ....

Während alle Antworten sind richtig, wenn Sie einen libary verwenden, die nicht const correct dann ist es schwierig konst alle Orte verwenden Sie es verwenden sollten.

Wenn Sie eine alte API, die eine char * nimmt, dass für alle logischen Zwecke sollte ein const char * sein, dann müssen Sie entweder const in Ihrem Code vergessen oder einige hässliche Gießen zu tun. In diesem Fall vergesse ich const.

+2

Die Alternative besteht darin, die API zu verpacken und zu bestimmen, ob sie tatsächlich Kostendaten aufnehmen sollte und wenn dies der Fall ist, die Konsistenz der Eingabedaten in Ihrem Wrapper wegwerfen. Dies bedeutet, dass Sie nur das hässliche Casting ONCE brauchen und Sie können die Tatsache kommentieren, dass Sie festgestellt haben, dass dies sicher und korrekt über Ihre Tests usw. war. IMHO sollten die meisten, wenn nicht alle "alten APIs" verpackt werden ... –

0

Ich habe Funktionen als const deklariert, aber jetzt mache ich selten mehr.

Das Hauptproblem war, dass, wenn ich eine Funktion von const zu non-const ändern wollte, würde es bedeuten, dass alle anderen const Funktionen, die diese Funktion aufrufen, auch zu non-const geändert werden müssten.

Das passierte öfter, als ich aufgrund der Optimierung dachte. Zum Beispiel hatte ich eine GetData() -Funktion, die einen Zeiger auf die Daten zurückgab, aber später optimierte ich, um die Daten nur einzurichten, wenn GetData() aufgerufen wird (was den Zustand des Objekts ändert, also ist es nicht länger ein const) Funktion).

Gleiches für andere Funktionen, die eine Berechnung durchführen könnten, ohne den Status des Objekts zu ändern, aber irgendwann war es sinnvoller, das Ergebnis zwischenzuspeichern, da die Funktion viele Male aufgerufen wurde und ein Flaschenhals war.

Auch in der Praxis, zumindest für mein Projekt, sah ich sehr wenig Nutzen davon, meine Funktionen als const zu deklarieren.

+3

Funktionen, die nicht funktionieren Wenn Sie den "logischen Wert" nicht ändern können, müssen Sie nur veränderliche Datenelemente für Ihren Cache verwenden. –

+0

Ja, stimme Rogers Kommentar zu. Datenelemente, die als veränderbar deklariert sind, können innerhalb einer const-Funktion geändert werden. – jasonline

1

Ich benutze const bei fast jeder Gelegenheit, und wie die Tatsache, dass es sowohl die Absichtserklärung liefert als auch die Einhaltung dieser Absicht durchsetzt. Sprachmerkmale werden nicht viel besser als das, und doch ist const seltsam ungeliebt.(Die Realität scheint zu sein, dass die Mehrheit der selbsternannten C++ Programmierer nicht den Unterschied zwischen int*, int*const, const int* erklären kann und const int*const.)

Während es nie wegen seiner Herkunft ‚C‘ passieren konnte, denke ich oft C++ würde sei eine bessere Sprache, wenn Const der Standard gewesen wäre und eine großzügige Streuung von (etwa) 'var' oder einem ähnlichen Schlüsselwort notwendig gewesen wäre, um eine Modifikation von Variablen nach der Konstruktion zu ermöglichen.

Verwandte Themen