Ich weiß, es gibt wenig Frage über const Korrektheit, wo es heißt, dass die Deklaration einer Funktion und ihre Definition für Wertparameter nicht übereinstimmen müssen. Dies liegt daran, dass die Konsistenz eines Wertparameters nur in der Funktion von Bedeutung ist. Das ist in Ordnung:Const Korrektheit für Wert-Parameter
// header
int func(int i);
// cpp
int func(const int i) {
return i;
}
Ist das wirklich eine Best Practice? Weil ich noch nie jemanden gesehen habe. Ich habe dieses Zitat gesehen (nicht sicher von der Quelle) an anderen Orten hat diese diskutiert:
"In fact, to the compiler, the function signature is the same whether you include this const in front of a value parameter or not."
"Avoid const pass-by-value parameters in function declarations. Still make the parameter const in the same function's definition if it won't be modified."
Der zweite Absatz sagt nicht die const in der Erklärung setzen. Ich gehe davon aus, dass die Konstanz eines Wertparameters als Teil einer Schnittstellendefinition bedeutungslos ist. Es ist ein Implementierungsdetail.
Aufgrund dieser Empfehlung wird es auch für die Zeigerwerte von Zeigerparametern empfohlen? (Es ist auf einem Referenz-Parameter bedeutungslos, da Sie nicht eine Referenz zuweisen können.)
// header
int func1(int* i);
int func2(int* i);
// cpp
int func1(int* i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compiles without error
return *i;
}
int func2(int* const i) {
int x = 0;
*i = 3; // compiles without error
i = &x; // compile error
return *i;
}
Zusammenfassung: machen Wertparameter nützlich ist, einige Logikfehler zu fangen. Ist es eine gute Praxis? Gehen Sie zu dem Extrem, das const aus der Header-Datei zu lassen? Ist es genauso nützlich, Zeigerwerte konstant zu halten? Warum oder warum nicht?
Einige Referenzen:
C++ const keyword - use liberally? Use of 'const' for function parameters
Ein Beispiel, wenn konst Wertparameter sind nützlich:
bool are_ints_equal(const int i, const int j) {
if (i = j) { // without the consts this would compile without error
return true;
} else {
return false;
}
// return i = j; // I know it can be shortened
}
Es fängt die „if (i = j)“ Fehler in diesem Fall muss aber nicht alle solche Fehler zu fangen, also würde ich mich über diese spezielle Logik nicht zu sehr aufregen (da Sie mit Variablen denselben Fehler machen können). Sogar ohne const sollte dein Compiler dich davor warnen, wenn du sagst, dass du Warnungen willst. – nobar
Der Punkt, an dem man durch 'if (i = j)' erregt wird, ist zu erkennen, dass konstante Werte nicht nur Flusen sind. Michael Burrs Beispiel ist sogar besser als dieses. – jmucchiello
In einer Situation, wo Sie die Funktionsparameter nicht ändern, sollten Sie sie const, weil A) es sicherer ist, B) es selbst-Dokumentieren, und C) es ist mehr Debug-freundlich. Außerdem sollten der Prototyp und der Header als const gekennzeichnet sein. Es ist verwirrend, wenn nur die im Header der Funktion getan. Das Argument zum Erstellen einer temporären Variablen innerhalb der Funktion ist eine Situation, in der Sie wahrscheinlich den/die Parameter const nicht deklarieren müssen. Das sind meine 2 Pfennige. –