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ć.

 100
Author: maf88_, 2008-10-02

9 answers

const T i T const są identyczne. Z typami wskaźników staje się to bardziej skomplikowane:

  1. const char* jest wskaźnikiem do stałej char
  2. char const* jest wskaźnikiem do stałej char
  3. 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).

 157
Author: Konrad Rudolph,
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
 309
Author: Ates Goral,
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;
}
 12
Author: Andru Luvisi,
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.

 7
Author: Fred Larson,
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.

 5
Author: Emerick Rogul,
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
 4
Author: Pat Notz,
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*

 3
Author: prakash,
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;
 3
Author: user7545,
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.

 2
Author: Nick Westgate,
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