Wie in Buch Effektives C ++ angegeben: "const wann immer möglich verwenden", würde man annehmen, dass diese Definition: Vec3f operator+(Vec3f &other);
besser als Vec3f operator+(const Vec3f &other) const;
oder noch besser als const Vec3f operator+(const Vec3f &other) const;
definiert wäre. .
Oder ein Beispiel mit 5 const Schlüsselwörtern: const int*const Foo(const int*const&)const;
Natürlich sollten Sie const nur dort angeben, wo es einen geben kann. Was bitte ich, ist es eine gute Praxis, sie wann immer möglich zu verwenden? Während es Ihnen mehr fehlerfreien Code gibt, kann es ziemlich unordentlich werden. Oder sollten Sie zum Beispiel Zeiger und Referenz const ignorieren (außer Sie wirklich brauchen), und verwenden Sie es nur für die Typen selbst, wie in const int* Foo(const int* parameter)const;
, so endet es nicht zu unordentlich?
Zusätzliche Informationen: Ссылка
Vielen Dank im Voraus!
Wenn Sie normale Sicherheit finden, hilft Ihnen, Systeme richtig zu bekommen tut; besonders in großen Systemen), finden Sie const Korrektheit hilft auch.
Sie sollten const
verwenden, wenn Sie sicherstellen möchten, dass die Variable nicht versehentlich oder absichtlich geändert wird. Einige Konstanten (globals und class static, strings & amp; integers, aber keine Variablen mit nichttrivialem Konstruktor) können in schreibgeschützte Teile der ausführbaren Datei eingefügt werden, was zu einem Segmentierungsfehler führt, wenn Sie versuchen, darauf zu schreiben.
Sie sollten explizit const
als Spezifizierer für Funktionen, die diesem Prinzip folgen, sowie für Funktionsargumente verwenden. Wenn Sie das tatsächliche Argument nicht ändern müssen, wählen Sie const
. Dies beschränkt nicht die möglichen Verwendungen einer solchen Funktion, sondern erweitert sie, da sie jetzt für const
Argumente und für const
Objekte verwendet werden können.
In der Deklaration
%Vor% jeder const
bedeutet etwas anderes und ja, offensichtlich sollte verwendet werden, wenn es gebraucht wird .
Die Verwendung von const
erhöht die Typsicherheit Ihres Programms.
[18.3] Sollte ich versuchen, const "früher" oder "später" zu korrigieren?
Sehr, ganz, ganz am Anfang.
Die Verwendung von const
ist in der Regel eine gute Sache, aber es ist eine schlechte Formulierung. Sie sollten const
verwenden, wo immer es möglich und sinnvoll ist .
Vor allem anderen (es kann, selten, öffnen Sie zusätzliche Optimierungsmöglichkeiten) ist es ein Mittel, um Ihre Absicht zu dokumentieren, nichts zu ändern.
Im konkreten Beispiel eines Mitglieds operator+
, das Sie angegeben haben, wäre die beste Lösung nicht alles const
, sondern ein freistehendes operator+
, das auf dem Element operator+=
basiert und ein Argument nach Wert nimmt so:
Diese Lösung funktioniert mit T
, das auf beiden Seiten des Pluszeichens erscheint, ermöglicht die Verkettung, repliziert Code nicht und ermöglicht dem Compiler, das Maximum an Optimierungen durchzuführen.
Die Semantik von operator+
erfordert, dass eine Kopie erstellt wird, so dass der Compiler sie auch erstellen kann (der andere wird optimiert).
Es wäre möglich, one
a const&
zu erstellen, aber dann müssten Sie manuell eine Kopie erstellen, die wahrscheinlich suboptimal (und viel weniger intelligent) wäre.
Ich denke, dass die Verwendung von const
, wenn immer möglich, ein guter Weg ist. Es fügt Ihrem Code eine implizite Dokumentation hinzu und erhöht die Typsicherheit, wie in den anderen Antworten erwähnt.
Es ist schön zu wissen, dass Sie const
-Funktionen aufrufen können, ohne sich Gedanken darüber machen zu müssen, ob sie den internen Status eines Objekts ändern und das Übergeben von const
-Zeigern oder Verweisen auf ein anderes Objekt vor Kapselungsbruch schützt. Objekte, die const
Referenzen besitzen, erhalten den größten Nutzen aus dem, worauf die Referenz verweist.
Auch das Anwenden von const
von Anfang an ist eine gute Idee, da es später mühsam sein kann, etwas hinzuzufügen. Zum Beispiel, wenn Sie eine Klasse haben:
Und noch eins:
%Vor%Und Sie wollen tun:
%Vor% Dies ist ein vollkommen gültiger Anwendungsfall, aber Sie müssen dann const
zu mehreren Orten hinzufügen, um es zu unterstützen ( B::getInternalCount()
und A::getCount()
). Wenn Sie es von Anfang an tun, ist es tatsächlich ziemlich einfach, const
zu verwenden und es macht das Design für andere Entwickler viel offensichtlicher. Wenn du alleine arbeitest, hilft es immer noch sehr, aber es ist nicht so wichtig. Bei der Arbeit in einem Team habe ich jedoch festgestellt, dass es sehr hilfreich war, wenn wir const
durchgesetzt haben und einige unserer alten Codes nachgerüstet haben, um mehr zu erreichen.
Lange Rede, kurzer Sinn: Ich empfehle immer, es zu benutzen.