const int vs. int const jako parametr funkcji w C++ i C
Szybkie Pytanie:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
Czy te dwie funkcje są takie same w każdym aspekcie, czy jest jakaś różnica? Interesuje mnie odpowiedź na język C, ale jeśli jest coś ciekawego w języku C++, to też chciałbym wiedzieć.
9 answers
const T
i T const
są identyczne. Z typami 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 tworzenia wskaźnika (zamiast wskaźnika) const
jest użycie sufiksu-const
.
Dlatego wiele osób woli zawsze umieścić const
w prawo strona Typu (Styl" East const"): sprawia, że jego położenie względem typu jest spójne i łatwe do zapamiętania(wydaje się również ułatwiać naukę początkującym).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-30 11:04:18
Sztuką jest odczytanie deklaracji wstecz (od prawej do lewej):
const int a = 1; // read as "a is an integer which is constant"
int const a = 1; // read as "a is a constant integer"
Oba są tym samym. Dlatego:
a = 2; // Can't do because a is constant
Sztuczka z czytaniem od tyłu jest szczególnie przydatna, gdy masz do czynienia z bardziej złożonymi deklaracjami, takimi jak:
const char *s; // read as "s is a pointer to a char that is constant"
char c;
char *const t = &c; // read as "t is a constant pointer to a char"
*s = 'A'; // Can't do because the char is constant
s++; // Can do because the pointer isn't constant
*t = 'A'; // Can do because the char isn't constant
t++; // Can't do because the pointer is constant
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 14:32:57
Nie ma żadnej różnicy. Obie deklarują "a" jako liczbę całkowitą, której nie można zmienić.
Miejsce, w którym zaczynają się pojawiać różnice, jest wtedy, gdy używasz wskaźników.
Oba:
const int *a
int const *a
Zadeklaruj" a " jako wskaźnik na liczbę całkowitą, która się nie zmienia. "a" może być przypisane do, ale "*a" nie może.
int * const a
Deklaruje " a " jako stały wskaźnik do liczby całkowitej. "*a " może być przypisane do, ale "a" nie może.
const int * const a
Deklaruje "a" jako stały wskaźnik do a stała liczba całkowita. Ani "a", ani "*a " nie mogą być przypisane do.
static int one = 1;
int testfunc3 (const int *a)
{
*a = 1; /* Error */
a = &one;
return *a;
}
int testfunc4 (int * const a)
{
*a = 1;
a = &one; /* Error */
return *a;
}
int testfunc5 (const int * const a)
{
*a = 1; /* Error */
a = &one; /* Error */
return *a;
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 14:28:33
Prakash ma rację, że deklaracje są takie same, chociaż przydałoby się trochę więcej wyjaśnienia sprawy 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ć na inny int.
Zobacz http://www.parashift.com/c++ - faq-lite / const-poprawność.html#faq-18.5.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 14:18:18
const int
jest identyczna z int const
, co jest prawdą dla wszystkich typów skalarnych w C. Ogólnie deklarowanie parametru funkcji skalarnej jako {[2] } nie jest potrzebne, ponieważ semantyka wywołania przez wartość C oznacza, że wszelkie zmiany w zmiennej są lokalne dla jej funkcji zamykającej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-05 18:11:43
To nie jest bezpośrednia odpowiedź, ale powiązana wskazówka. Aby wszystko było proste, zawsze używam konwekcji "put const
on the outside", gdzie przez "outside" mam na myśli lewą lub prawą stronę. W ten sposób nie ma zamieszania-const odnosi się do najbliższej rzeczy (albo typu, albo *
). Np.,
int * const foo = ...; // Pointer cannot change, pointed to value can change
const int * bar = ...; // Pointer can change, pointed to value cannot change
int * baz = ...; // Pointer can change, pointed to value can change
const int * const qux = ...; // Pointer cannot change, pointed to value cannot change
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 15:20:18
Yes, they are same for just int
I inne dla int*
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 14:13:36
Myślę, że w tym przypadku są takie same, ale tutaj jest przykład, gdzie liczy się porządek:
const int* cantChangeTheData;
int* const cantChangeTheAddress;
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-02 14:15:02
Są takie same, ale w C++ jest dobry powód, aby zawsze używać const po prawej stronie. Będziesz zawsze spójny, ponieważ funkcje składowe const muszą być zadeklarowane w ten sposób:
int getInt() const;
Zmienia wskaźnik this
w funkcji z Foo * const
na Foo const * const
. Zobacz tutaj.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:47