Warum genau wird immer empfohlen, const so oft wie möglich zu verwenden? Es scheint mir, dass die Verwendung von const in C ++ eher ein Schmerz als eine Hilfe sein kann. Aber andererseits komme ich aus der Python-Perspektive dazu: Wenn Sie nicht möchten, dass etwas geändert wird, ändern Sie es nicht. Nachdem dies gesagt wurde, sind hier einige Fragen:
Es scheint, als würde jedes Mal, wenn ich etwas als const markiere, eine Fehlermeldung angezeigt und ich muss irgendwo eine andere Funktion ändern, um auch const zu sein. Dann muss ich irgendwo anders eine andere Funktion ändern . Wird das mit der Erfahrung noch einfacher?
Reichen die Vorteile der Verwendung von const wirklich aus, um die Probleme zu kompensieren? Wenn Sie nicht vorhaben, ein Objekt zu ändern, schreiben Sie doch einfach Code, der es nicht ändert.
Ich sollte beachten, dass ich mich zu diesem Zeitpunkt am meisten auf die Vorteile der Verwendung von const für Korrektheits- und Wartbarkeitszwecke konzentriere, obwohl es auch schön ist, eine Vorstellung von den Auswirkungen auf die Leistung zu haben.
quelle
const
Antworten:
Dies ist der endgültige Artikel zum Thema "Konstante Korrektheit": https://isocpp.org/wiki/faq/const-correctness .
Kurz gesagt, die Verwendung von const ist eine gute Praxis, weil ...
Der Compiler kann es optimieren. Zum Beispiel sind Sie vor geschützt
Gleichzeitig kann der Compiler effizienteren Code generieren, da er jederzeit genau weiß, wie der Status der Variablen / Funktion sein wird. Wenn Sie engen C ++ - Code schreiben, ist dies gut.
Sie haben insofern Recht, als es schwierig sein kann, die Konstanten-Korrektheit konsistent zu verwenden, aber der Endcode ist präziser und sicherer zu programmieren. Wenn Sie viel C ++ entwickeln, zeigen sich die Vorteile schnell.
quelle
const
Variablen können die Geschwindigkeit in dem Sinne verbessern, dass der Compiler optimaleren Code generieren kann, da er die volle Absicht und Verwendung der Variablen kennt. Wirst du den Unterschied bemerken? Nun, das ist bei Ihrer Bewerbung umstritten. In Bezug auf die Parallelität sind const-Variablen schreibgeschützt, was bedeutet, dass diese Variablen nicht exklusiv gesperrt werden müssen, da der Wert immer gleich ist.const
, dass sie threadsicher ist. Die Behandlung Ihres eigenen Codes auf diese Weise erleichtert die Überprüfung auf mögliche Multithreading-Probleme und bietet eine einfache Möglichkeit, API-Garantien für Ihre API-Benutzer bereitzustellen.Hier ist ein Teil des Codes mit einem häufigen Fehler, vor dem Sie durch konstante Korrektheit geschützt werden können:
quelle
Aus Erfahrung ist dies ein totaler Mythos. Es passiert, wenn nicht const-korrekt mit const-korrektem Code sitzt, klar. Wenn Sie von Anfang an const-korrekt entwerfen, sollte dies NIEMALS ein Problem sein. Wenn Sie etwas const machen und dann etwas anderes nicht kompatibel ist, sagt Ihnen der Compiler etwas extrem Wichtiges, und Sie sollten sich die Zeit nehmen, um es richtig zu reparieren .
quelle
const
richtig verwendet hätten (dh "von Anfang an"), dann gäbe es tatsächlich kein Problem, und genau darum geht es!Es ist nichts für Sie, wenn Sie den Code anfänglich schreiben. Es ist für jemanden (oder Sie einige Monate später), der sich die Methodendeklaration in der Klasse oder Schnittstelle ansieht, um zu sehen, was sie tut. Das Nichtmodifizieren eines Objekts ist eine wichtige Information, die daraus gewonnen werden kann.
quelle
Wenn Sie const rigoros verwenden, werden Sie überrascht sein, wie wenig reale Variablen in den meisten Funktionen vorhanden sind. Oft nicht mehr als ein Schleifenzähler. Wenn Ihr Code diesen Punkt erreicht, bekommen Sie ein warmes Gefühl im Inneren ... Validierung durch Kompilierung ... das Reich der funktionalen Programmierung ist in der Nähe ... Sie können es jetzt fast berühren ...
quelle
const ist ein Versprechen, das Sie als Entwickler machen und das die Hilfe des Compilers bei der Durchsetzung in Anspruch nimmt.
Meine Gründe, um konstant zu sein:
quelle
Meine Philosophie ist, dass Sie, wenn Sie eine wählerische Sprache mit Überprüfungen der Kompilierungszeit verwenden möchten, diese optimal nutzen können.
const
ist eine vom Compiler erzwungene Art zu kommunizieren, was Sie meinen ... es ist besser als Kommentare oder Sauerstoff jemals sein werden. Sie zahlen den Preis, warum nicht den Wert ableiten?quelle
Das Programmieren von C ++ ohne const ist wie das Fahren ohne Sicherheitsgurt.
Es ist ein Schmerz, den Sicherheitsgurt jedes Mal anzulegen, wenn Sie in das Auto steigen, und 364 von 365 Tagen werden Sie sicher ankommen.
Der einzige Unterschied besteht darin, dass Sie es sofort spüren, wenn Sie Probleme mit Ihrem Auto haben, während Sie bei der Programmierung ohne Konstante möglicherweise zwei Wochen lang suchen müssen, was diesen Absturz verursacht hat, nur um herauszufinden, dass Sie versehentlich ein Funktionsargument durcheinander gebracht haben Sie haben eine nicht konstante Referenz für die Effizienz übergeben.
quelle
Bei der eingebetteten Programmierung kann eine
const
vernünftige Verwendung beim Deklarieren globaler Datenstrukturen viel RAM sparen, indem die konstanten Daten im ROM oder Flash gespeichert werden, ohne dass sie beim Booten in den RAM kopiert werden.Bei der täglichen Programmierung können Sie durch
const
sorgfältiges Verwenden vermeiden, dass Sie Programme schreiben, die abstürzen oder sich unvorhersehbar verhalten, weil sie versuchen, Zeichenfolgenliterale und andere konstante globale Daten zu ändern.Wenn Sie bei großen Projekten mit anderen Programmierern zusammenarbeiten,
const
verhindert die ordnungsgemäße Verwendung , dass die anderen Programmierer Sie drosseln.quelle
const
hilft Ihnen dabei, Code zu isolieren, der Dinge hinter Ihrem Rücken "verändert". In einer Klasse markieren Sie also alle Methoden, die den Status des Objekts nicht ändern, alsconst
. Dies bedeutet, dassconst
Instanzen dieser Klasse keine Nichtmethoden mehr aufrufen könnenconst
. Auf diese Weise wird verhindert, dass Sie versehentlich Funktionen aufrufen, die Ihr Objekt ändern können.Ist auch
const
Teil des Überladungsmechanismus, sodass Sie zwei Methoden mit identischen Signaturen verwenden können, jedoch eine mitconst
und eine ohne. Der eine mitconst
wird fürconst
Referenzen aufgerufen , und der andere wird für Nichtreferenzen aufgerufenconst
.Beispiel:
quelle
Konstante Korrektheit ist eines der Dinge, die wirklich von Anfang an vorhanden sein müssen. Wie Sie festgestellt haben, ist es ein großer Schmerz, es später hinzuzufügen, insbesondere wenn eine große Abhängigkeit zwischen den neuen Funktionen, die Sie hinzufügen, und den alten, nicht konstanten Funktionen besteht, die bereits vorhanden sind.
In vielen Codes, die ich schreibe, hat sich die Mühe wirklich gelohnt, da wir häufig Kompositionen verwenden:
Wenn wir keine Konstantenkorrektheit hätten, müssten Sie komplexe Objekte nach Wert zurückgeben, um sich zu vergewissern, dass niemand den internen Zustand der Klasse B hinter Ihrem Rücken manipuliert.
Kurz gesagt, Konstanzkorrektheit ist ein defensiver Programmiermechanismus, um sich vor Schmerzen zu schützen.
quelle
Angenommen, Sie haben eine Variable in Python. Sie wissen , dass Sie nicht soll es ändern. Was ist, wenn Sie es versehentlich tun?
Mit C ++ können Sie sich davor schützen, versehentlich etwas zu tun, was Sie eigentlich gar nicht hätten tun sollen. Technisch kann man es sowieso umgehen, aber man muss zusätzliche Arbeit investieren, um sich selbst zu erschießen.
quelle
Es gibt einen schönen Artikel hier etwa const in C ++. Es ist eine ziemlich direkte Meinung, aber ich hoffe, es hilft einigen.
quelle
Wenn Sie das Schlüsselwort "const" verwenden, geben Sie eine andere Schnittstelle für Ihre Klassen an. Es gibt eine Schnittstelle, die alle Methoden enthält, und eine Schnittstelle, die nur die const-Methoden enthält. Auf diese Weise können Sie natürlich den Zugriff auf einige Dinge einschränken, die nicht geändert werden sollen.
Ja, mit der Zeit wird es einfacher.
quelle
Ich mag konstante Korrektheit ... theoretisch. Jedes Mal, wenn ich versucht habe, es in der Praxis rigoros anzuwenden, ist es irgendwann zusammengebrochen und const_cast macht sich langsam daran, den Code hässlich zu machen.
Vielleicht sind es nur die Designmuster, die ich verwende, aber const ist immer ein zu breiter Pinsel.
Stellen Sie sich zum Beispiel ein einfaches Datenbankmodul vor ... es enthält Schemaobjekte, Tabellen, Felder usw. Ein Benutzer verfügt möglicherweise über einen 'const Table'-Zeiger, der bedeutet, dass er das Tabellenschema selbst nicht ändern darf ... aber was ist mit der Manipulation? die mit der Tabelle verknüpften Daten? Wenn die Insert () -Methode als const markiert ist, muss sie intern die const-ness wegwerfen, um die Datenbank tatsächlich zu manipulieren. Wenn es nicht als const markiert ist, schützt es nicht vor dem Aufruf der AddField-Methode.
Vielleicht besteht die Antwort darin, die Klasse basierend auf den Konstanzanforderungen aufzuteilen, aber das erschwert das Design tendenziell mehr, als ich es mir zum Vorteil wünschen würde.
quelle
Sie können dem Compiler auch Hinweise mit const geben .... gemäß dem folgenden Code
quelle