Rozważać:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
Czy te dwie funkcje są takie same pod każdym względem, czy też istnieje różnica?
Interesuje mnie odpowiedź na język C, ale jeśli jest coś ciekawego w języku C ++, to też chciałbym wiedzieć.
Odpowiedzi:
const T
iT const
są identyczne. W przypadku typów wskaźników staje się to bardziej skomplikowane:const char*
jest wskaźnikiem do stałejchar
char const*
jest wskaźnikiem do stałejchar
char* const
jest stałym wskaźnikiem do (zmiennego)char
Innymi słowy, (1) i (2) są identyczne. Jedynym sposobem utworzenia wskaźnika (a nie pointee)
const
jest użycie przyrostka-const
.Dlatego wiele osób woli zawsze umieszczać czcionkę
const
po prawej stronie (styl „wschodnia stała”): sprawia, że jej położenie względem typu jest spójne i łatwe do zapamiętania (wydaje się również, że anegdotycznie ułatwia to nauczanie początkujących ).źródło
Sztuczka polega na przeczytaniu deklaracji od tyłu (od prawej do lewej):
Obie są tym samym. W związku z tym:
Sztuczka z czytaniem wstecz jest szczególnie przydatna, gdy masz do czynienia z bardziej złożonymi deklaracjami, takimi jak:
źródło
char const *
, czytane od lewej do prawej to: „wskaźnik, stała, znak”. To wskaźnik do const char. Kiedy mówisz „wskaźnik, który jest stały”, przymiotnik „stały” znajduje się na wskaźniku. Tak więc w tym przypadku Twoja lista przymiotników powinna wyglądać tak: „const, pointer, char”. Ale masz rację, ta sztuczka jest niejednoznaczna. To naprawdę „sztuczka”, więcej niż ostateczna „zasada”.Nie ma różnicy. Obaj deklarują „a” jako liczbę całkowitą, której nie można zmienić.
Miejscem, w którym zaczynają się pojawiać różnice, jest użycie wskaźników.
Obie z nich:
zadeklarować „a” jako wskaźnik do liczby całkowitej, która się nie zmienia. Można przypisać „a”, ale „* a” nie można.
deklaruje „a” jako stały wskaźnik do liczby całkowitej. „* a” można przypisać do, ale „a” nie można.
deklaruje „a” jako stały wskaźnik do stałej liczby całkowitej. Nie można przypisać ani „a”, ani „* a”.
źródło
Prakash ma rację, twierdząc, że deklaracje są takie same, chociaż może być potrzebne trochę więcej wyjaśnienia przypadku wskaźnika.
„const int * p” jest wskaźnikiem do int, który nie pozwala na zmianę int przez ten wskaźnik. „int * const p” jest wskaźnikiem do int, którego nie można zmienić, aby wskazywało na inną int.
Zobacz https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const .
źródło
const int
jest identycznyint const
, jak jest prawdziwy w przypadku wszystkich typów skalarnych w C. Ogólnie, deklarowanie parametru funkcji skalarnej jakoconst
niepotrzebne, ponieważ semantyka wywołania przez wartość w C oznacza, że wszelkie zmiany w zmiennej są lokalne dla jej funkcji otaczającej.źródło
To nie jest bezpośrednia odpowiedź, ale powiązana wskazówka. Aby wszystko było proste, zawsze używam konwekcji „
const
na zewnątrz”, gdzie przez „na zewnątrz” mam na myśli skrajną lewą lub skrajną prawą. W ten sposób nie ma zamieszania - stała odnosi się do najbliższej rzeczy (albo typu, albo*
). Na przykład,źródło
Są takie same, ale w C ++ jest dobry powód, aby zawsze używać const po prawej stronie. Będziesz spójny wszędzie, ponieważ funkcje składowe const muszą być deklarowane w ten sposób:
Zmienia
this
wskaźnik funkcji zFoo * const
naFoo const * const
. Spójrz tutaj.źródło
Tak, są takie same tylko
int
i inne dla
int*
źródło
Myślę, że w tym przypadku są takie same, ale oto przykład, w którym porządek ma znaczenie:
źródło