Правильность константы для параметров, передаваемых по значению

Конфигурация палаты общин

Мы используем это. Одни только файлы свойств намного легче обработать, но если необходимо представить более сложную конфигурацию свободного городского населения данных, может сделать это и считать файлы свойств также.

, Если бы Вы ничего не делаете, усложнил, я придерживался бы properites файлов.

26
задан Community 23 May 2017 в 11:46
поделиться

5 ответов

Мое мнение:

Это неплохая идея, но проблема незначительна, а ваша энергия может быть лучше потрачено на другие вещи.

В своем вопросе вы привели хороший пример того, когда он может обнаруживать ошибку, но иногда вы также делаете что-то вроде этого:

void foo(const int count ...)
{
   int temp = count;  // can't modify count, so we need a copy of it
   ++temp;

   /* ... */
}

Плюсы и минусы в любом случае незначительны.

9
ответ дан 28 November 2019 в 17:24
поделиться

Я много раз читал, что создание параметров значений в функции const - плохой поступок, потому что в этом нет необходимости.

Однако я нахожу это иногда полезным для меня в качестве проверки того, что моя реализация не делает того, чего я не собираюсь (как в примере в конце вашего вопроса).

Таким образом, хотя она может и не добавить ценности для вызывающей стороны, она иногда добавляет немного ценности к меня как разработчика, и это ничего не отнимает у вызывающего. Так что я не вижу вреда в его использовании.

Например, я могу реализовать функцию C, которая принимает пару указателей на буфер - указатель на начало и указатель на конец. Я собираюсь поместить данные в буфер, но хочу быть уверенным, что не выйду за край. Итак, внутри функции есть код, который будет увеличивать указатель как I ' m добавляя в него данные. Создание указателя на конец буфера параметром const гарантирует, что я не закодирую ошибку, которая случайно увеличивает указатель конечной границы вместо указателя, который я действительно должен увеличивать.

Итак. функция fillArray с такой подписью:

size_t fillArray( data_t* pStart, data_t* const pEnd);

предотвратит случайное увеличение pEnd , когда я действительно хочу увеличить pStart . Это не большая проблема, но я почти уверен, что каждый, кто программировал какое-то время на C, сталкивался с такой ошибкой.

Итак, функция fillArray с такой подписью:

size_t fillArray( data_t* pStart, data_t* const pEnd);

предотвратит случайное увеличение pEnd , когда я действительно хочу увеличить pStart . Это не большая проблема, но я почти уверен, что каждый, кто программировал какое-то время на C, сталкивался с такой ошибкой.

Итак, функция fillArray с такой подписью:

size_t fillArray( data_t* pStart, data_t* const pEnd);

предотвратит случайное увеличение pEnd , когда я действительно хочу увеличить pStart . Это не большая проблема, но я почти уверен, что каждый, кто программировал какое-то время на C, сталкивался с такой ошибкой.

10
ответ дан 28 November 2019 в 17:24
поделиться

Я думаю, это зависит от вашего личного стиля.

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

Одна из причин, по которой я могу этого не делать, заключается в том, что постоянство параметра value - это деталь реализации, о которой вашим клиентам не нужно знать. Если вы позже (намеренно) измените свою функцию так, чтобы она действительно изменила это значение, вам нужно будет изменить подпись своей функции, что заставит ваших клиентов перекомпилировать.

Это похоже на то, почему некоторые люди рекомендуют не имея общедоступных виртуальных методов (виртуальность функций - это деталь реализации, которая должна быть скрыта от клиентов),

0
ответ дан 28 November 2019 в 17:24
поделиться

К сожалению, некоторые компиляторы (я смотрю на вас, Sun CC!) Неправильно различают аргументы, объявленные как const, и аргументы, не объявленные таким образом, и вы можете получить ошибки, связанные с неопределенными функциями.

1
ответ дан 28 November 2019 в 17:24
поделиться

Мне нравится правильность констант в таких ситуациях:
void foo (const Bar & b) // Я знаю, что b нельзя изменить
{
// что-то делаем с b
}

Это позволяет мне использовать b , не опасаясь его изменять, но мне не нужно платить за конструктор копирования.

-2
ответ дан 28 November 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: