const int vs. int const как параметр функции в C ++ и C

Быстрый вопрос:

int testfunc1 (const int a) { return a; } int testfunc2 (int const a) { return a; } 

Являются ли эти две функции одинаковыми во всех аспектах или есть разница? Меня интересует ответ на C-язык, но если на языке C ++ есть что-то интересное, я бы тоже хотел узнать.

const T и T const идентичны. С типами указателей он становится более сложным:

  1. const char* – это указатель на константу char
  2. char const* – указатель на константу char
  3. char* const – постоянный указатель на (изменяемый) char

Другими словами, (1) и (2) идентичны. Единственный способ сделать указатель (а не pointee) const использовать суффикс- const .

Вот почему многие люди предпочитают всегда ставить const с правой стороны типа (стиль «East const»): он делает свое местоположение относительно типа, согласованного и легко запоминаемого (он также, по-видимому, облегчает обучение для начинающих).

Трюк состоит в том, чтобы прочитать декларацию назад (справа налево):

 const int a = 1; // read as "a is an integer which is constant" int const a = 1; // read as "a is a constant integer" 

Оба – одно и то же. Следовательно:

 a = 2; // Can't do because a is constant 

Чтение обратного трюка особенно полезно, когда вы имеете дело с более сложными объявлениями, такими как:

 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 

Нет никакой разницы. Оба объявляют «a» целым числом, которое невозможно изменить.

Место, где различия появляются, – это когда вы используете указатели.

Оба из них:

 const int *a int const *a 

объявить «a» указателем на целое число, которое не изменяется. «a» может быть назначено, но «* a» не может.

 int * const a 

объявляет «a» постоянным указателем на целое число. «* a» может быть назначено, но «a» не может.

 const int * const a 

объявляет «a» постоянным указателем на постоянное целое число. Ни «a», ни «* a» не может быть назначено.

 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; } 

Пракаш прав, что объявления одинаковы, хотя может быть и немного больше объяснений в случае с указателем.

«const int * p» – это указатель на int, который не позволяет изменять int с помощью этого указателя. «int * const p» – это указатель на int, который нельзя изменить, чтобы указать на другой int.

См. http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.5 .

const int идентичен int const , как и для всех скалярных типов в C. В общем случае объявление параметра скалярной функции как const не требуется, так как семантика вызова по значению C означает, что любые изменения в переменной локальны для его охватывающая функция.

Это не прямой ответ, а связанный отзыв. Чтобы все было прямо, я всегда использую конвекцию «put const снаружи», где «снаружи» я имею в виду дальний левый или крайний правый. Таким образом, нет путаницы – константа относится к ближайшей вещи (либо к типу, либо к * ). Например,

 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 

Да, они одинаковы для просто int

и разные для int*

Я думаю, что в этом случае они одинаковы, но вот пример, где имеет значение порядок:

 const int* cantChangeTheData; int* const cantChangeTheAddress; 

Они одинаковы, но на C ++ есть хорошая причина всегда использовать const справа. Вы будете постоянными везде, потому что функции-члены-члены должны быть объявлены следующим образом:

 int getInt() const; 

Он изменяет this указатель в функции от Foo * const до Foo const * const . Глянь сюда.

  • Сколько и какие использует «const» в C ++?
  • Что означает «const» в конце объявления функции?
  • C ++ typedef интерпретация константных указателей
  • int vs const int &
  • const &, & и && спецификаторы для функций-членов в C ++
  • Доступ к элементу C ++ const
  • Почему ссылка, не связанная с константой, не может привязываться к временному объекту?
  • objective возврата значения const?
  • C # для обозначения констант?
  • Инициализация массива использует переменную const в C ++
  • C ++ 0x lambda-захват по значению всегда const?
  • Interesting Posts

    Установка драйверов Nvidia на Red Hat

    Высота веб-страницы jQuery

    Рекомендации по использованию аккумулятора батареи Windows

    Как отменить NSBlockOperation

    Windows 8 не будет установлена ​​на моем ПК через USB, но будет с моего ноутбука. Код ошибки: 0xC00000005

    Как преобразовать строку даты с необязательными дробными секундами, используя Codable в Swift4

    Изменение диска с файловой системой Windows 10

    Как исправить: обработчик «PageHandlerFactory-Integrated» имеет плохой модуль «ManagedPipelineHandler» в своем списке модhive

    Создание функции с переменным числом аргументов или параметров в Dart

    Можете ли вы отключить кеш шрифтов VLC?

    Внешняя папка вывода в eclipse

    Как вы можете передать несколько примитивных параметров AsyncTask?

    Исключения, которые не могут быть захвачены блоком try-catch в коде приложения

    Можно ли инициализировать атрибут C # с массивом или другим переменным числом аргументов?

    Редактирование функциональности эмуляции гостевой карты в Android

    Давайте будем гением компьютера.