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
constNa 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 constto 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 fpodana 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 constczasami 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);
constjest tu zbędny, jak myślisz, co się dzieje?