542 Stimmen

Verwendung von 'const' für Funktionsparameter

Wie weit gehen Sie mit const ? Machen Sie einfach Funktionen const wenn es nötig ist, oder gehen Sie aufs Ganze und verwenden es überall? Stellen Sie sich zum Beispiel einen einfachen Mutator vor, der einen einzigen booleschen Parameter annimmt:

void SetValue(const bool b) { my_val_ = b; }

Ist das const tatsächlich nützlich? Ich persönlich entscheide mich dafür, es ausgiebig zu nutzen, einschließlich der Parameter, aber in diesem Fall frage ich mich, ob es sich lohnt?

Ich war auch überrascht zu erfahren, dass man die const von Parametern in einer Funktionsdeklaration, sondern kann sie in die Funktionsdefinition aufnehmen, z. B.:

.h-Datei

void func(int n, long l);

.cpp-Datei

void func(const int n, const long l)

Gibt es dafür einen Grund? Es erscheint mir ein wenig ungewöhnlich.

4voto

HarshaXsoad Punkte 718

Vielleicht ist dies kein gültiges Argument, aber wenn wir den Wert einer Konstanten Variable innerhalb einer Funktion erhöhen, gibt der Compiler einen Fehler aus: " Fehler: Inkrement eines Nur-Lese-Parameters Das bedeutet, dass wir das Schlüsselwort "const" verwenden können, um zu verhindern, dass wir versehentlich unsere Variablen innerhalb von Funktionen ändern (die wir nicht lesen sollen). Wenn wir es also versehentlich während der Kompilierung getan haben, wird der Compiler uns das mitteilen.

4voto

jdmichal Punkte 10727

Ich neige dazu, wo immer es möglich ist, Konst zu verwenden. (Oder ein anderes geeignetes Schlüsselwort für die Zielsprache.) Ich tue dies nur, weil es dem Compiler erlaubt, zusätzliche Optimierungen vorzunehmen, die er sonst nicht durchführen könnte. Da ich keine Ahnung habe, was diese Optimierungen sein könnten, mache ich das immer, auch wenn es albern erscheint.

Soweit ich weiß, könnte der Compiler sehr wohl einen Parameter mit konstantem Wert sehen und sagen: "Hey, diese Funktion ändert ihn sowieso nicht, also kann ich ihn per Referenz übergeben und einige Taktzyklen sparen." Ich glaube nicht, dass er so etwas jemals tun würde, da er die Funktionssignatur ändert, aber das ist ein Argument. Vielleicht macht es eine andere Stack-Manipulation oder so... Der Punkt ist, ich weiß es nicht, aber ich weiß, dass der Versuch, schlauer als der Compiler zu sein, nur dazu führt, dass ich beschämt werde.

C++ hat mit der Idee der const-Korrektheit einige zusätzliche Probleme, so dass es noch wichtiger wird.

2voto

Dror Helper Punkte 29647

Ich verwende Const, wo ich kann. Const für Parameter bedeutet, dass sie ihren Wert nicht ändern sollten. Dies ist besonders wertvoll bei der Übergabe per Referenz. const für Funktionen bedeutet, dass die Funktion die Klassenmitglieder nicht ändern darf.

2voto

YvesgereY Punkte 3538

Zusammengefasst:

  • "Normalerweise ist das Pass-by-Value-Verfahren unbrauchbar und bestenfalls irreführend." Aus GOTW006
  • Sie können sie jedoch in der .cpp-Datei hinzufügen, wie Sie es mit Variablen tun würden.
  • Beachten Sie, dass die Standardbibliothek const nicht verwendet. Z.B.. std::vector::at(size_type pos) . Was für die Standardbibliothek gut genug ist, ist auch für mich gut.

2voto

Luke Halliwell Punkte 7297

In dem von Ihnen erwähnten Fall hat dies keine Auswirkungen auf die Aufrufer Ihrer API, weshalb es nicht üblich ist (und im Header nicht erforderlich ist). Es wirkt sich nur auf die Implementierung Ihrer Funktion aus.

Das ist nicht unbedingt schlecht, aber die Vorteile sind nicht so groß, da es sich nicht auf die API auswirkt und zusätzliche Tipparbeit bedeutet.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X