Edytować
Jak skomentował MM, o parametrach prototypówconst
jest ignorowany. Edytowane źródło oryginalnej odpowiedzi (patrz poniżej) pokazuje to:
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;
}
Brak komunikatu o błędzie.
W każdym razie zostawię oryginał na miejscu w nadziei, że może to pomóc.
Oryginalny
const
Na parametr sprawia, że ten parametr tylko do odczytu wewnątrz funkcji.
Na przykład:
float correct(float const value) {
return -value;
}
float erroneous(float const value) {
value = -value;
return value;
}
float changer(float value) {
value = -value;
return value;
}
To źródło nie skompiluje się bez komunikatu o błędzie.
Funkcja correct()
odczyta podaną wartość, zmieni jej znak i zwróci wartość zanegowaną.
Funkcja erroneous()
wydaje się działać tak samo, z tym wyjątkiem, że do parametru przypisano przypisanie. Ale jako parametr jest const
to niedozwolone.
Następnie funkcja changer()
będzie działać tak samo jak poprzednio, ale nie spowoduje błędów.
Spójrzmy na stronę połączeń:
float f = 3.14159;
float g = correct(f); // or erroneous(f) or changer(f)
Zmienna f
podana jako argument zostanie skopiowana do parametru value
. Nigdy się nie zmieni, nawet jeśli changer()
zostanie wywołany.
Możesz spojrzeć na parametry jako na rodzaj zmiennych lokalnych. W rzeczywistości są one w większości obsługiwane w ten sposób w wygenerowanym kodzie maszynowym.
Dlaczego więc const
czasami widzisz ? Widzisz to, jeśli wskaźnik jest zdefiniowany jako parametr.
Jeśli nie chcesz, aby wskazywana wartość była zmieniana, musisz dodać const
; ale zrób to we właściwej pozycji!
void effective(int const * pointer);
void futile(int * const pointer);
void possible_but_overly_restricted(int const * const pointer);
const
jest tu zbędny, jak myślisz, co się dzieje?