Bearbeiten
Wie MM kommentierte, wird bei Parametern in Prototypen das const
ignoriert. Die bearbeitete Quelle der ursprünglichen Antwort (siehe unten) zeigt Folgendes:
float correct(float const value);
float erroneous(float const value);
float changer(float value);
float correct(float value) {
return -value;
}
float erroneous(float value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
Es gibt keine Fehlermeldung.
Wie auch immer, ich werde das Original an Ort und Stelle lassen, in der Hoffnung, dass es helfen könnte.
Original
Der const
Parameter at a macht diesen Parameter innerhalb der Funktion schreibgeschützt.
Zum Beispiel:
float correct(float const value) {
return -value;
}
float erroneous(float const value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
Diese Quelle wird nicht ohne Fehlermeldung kompiliert.
Die Funktion correct()
liest den angegebenen Wert, ändert sein Vorzeichen und gibt den negierten Wert zurück.
Die Funktion erroneous()
scheint effektiv dasselbe zu tun, außer dass dem Parameter eine Zuordnung vorliegt. Da der Parameter jedoch ist, ist const
dies nicht zulässig.
Als nächstes funktioniert die Funktion changer()
wie beide zuvor, gibt jedoch keine Fehler aus.
Schauen wir uns die Anrufseite an:
float f = 3.14159;
float g = correct(f); // or erroneous(f) or changer(f)
Die f
als Argument angegebene Variable wird in den Parameter kopiertvalue
. Es wird sich nie ändern, auch wenn changer()
es aufgerufen wird.
Möglicherweise möchten Sie Parameter als eine Art lokale Variablen betrachten. Tatsächlich werden sie im generierten Maschinencode meistens so behandelt.
Also, warum siehst du const
manchmal? Sie sehen es, wenn ein Zeiger als Parameter definiert ist.
Wenn Sie nicht möchten, dass der Wert , auf den gezeigt wird, geändert wird, müssen Sie hinzufügen const
. aber mach es an der richtigen Position!
void effective(int const * pointer);
void futile(int * const pointer);
void possible_but_overly_restricted(int const * const pointer);
const
ist hier überflüssig, was denkst du passiert?