Продай меня по правильности - PullRequest
115 голосов
/ 26 сентября 2008

Так почему же всегда рекомендуется использовать const как можно чаще? Мне кажется, что использование const может быть более болезненным, чем помощь в C ++. Но опять же, я подхожу к этому с точки зрения питона: если вы не хотите, чтобы что-то изменилось, не меняйте это. Итак, с учетом сказанного, вот несколько вопросов:

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

  2. Достаточно ли преимуществ использования const , чтобы компенсировать проблему? Если вы не собираетесь менять объект, почему бы просто не написать код, который его не меняет?

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

Ответы [ 16 ]

148 голосов
/ 26 сентября 2008

Это окончательная статья о «правильности констант»: https://isocpp.org/wiki/faq/const-correctness.

В двух словах, использование const является хорошей практикой, потому что ...

  1. Он защищает вас от случайного изменения переменных, которые не предназначены для изменения,
  2. Он защищает вас от случайных присвоений переменных, а
  3. Компилятор может оптимизировать его. Например, вы защищены от

    if( x = y ) // whoops, meant if( x == y )
    

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

Вы правы в том, что может быть сложно последовательно использовать const -корректность, но конечный код более лаконичен и безопаснее для программирования. Когда вы много занимаетесь разработкой на C ++, преимущества этого быстро проявляются.

119 голосов
/ 26 сентября 2008

Вот фрагмент кода с распространенной ошибкой, от которой можно защититься от правильности:

void foo(const int DEFCON)
{
   if (DEFCON = 1)     //< FLAGGED AS COMPILER ERROR! WORLD SAVED!
   {
       fire_missiles();
   }
}
60 голосов
/ 26 сентября 2008

Кажется, что каждый раз, когда я отмечаю что-то как const, я получаю ошибку и должны изменить какую-то другую функцию где-то, чтобы быть const тоже. Тогда это заставляет меня изменить другой функционировать где-то еще. Это то, что становится легче с опыт?

Из опыта это полный миф. Это происходит, когда не const-correct сидит с кодом const-correct, конечно. Если вы разрабатываете const-correct с самого начала, это НИКОГДА не должно быть проблемой. Если вы делаете что-то const, а затем что-то еще не компилируется, компилятор говорит вам что-то чрезвычайно важное, и вам нужно время, чтобы исправить это правильно .

29 голосов
/ 26 сентября 2008

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

24 голосов
/ 27 сентября 2008

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

21 голосов
/ 26 сентября 2008

const - это обещание, которое вы даете разработчику и заручаетесь поддержкой компилятора.

Мои причины быть правильными:

  • Он сообщает клиентам вашей функции, что вы не будете изменять переменную или объект
  • Принятие аргументов по константной ссылке дает вам эффективность передачи по ссылке с безопасностью передачи по значению.
  • Правильное написание ваших интерфейсов позволит клиентам использовать их. Если вы напишите свой интерфейс для использования неконстантных ссылок, клиенты, использующие const, должны будут отбрасывать constness, чтобы работать с вами. Это особенно раздражает, если ваш интерфейс принимает неконстантные char *, а ваши клиенты используют std :: strings, поскольку вы можете получить только const char * из них.
  • Использование const поможет компилятору сохранить вашу честность, чтобы вы по ошибке не изменили то, что не должно измениться.
18 голосов
/ 26 сентября 2008

Программирование C ++ без const похоже на вождение без ремня безопасности.

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

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

18 голосов
/ 26 сентября 2008

Моя философия заключается в том, что если вы собираетесь использовать придирчивый язык с проверками времени компиляции, используйте его как можно лучше. const - это способ сообщить компилятору, что вы имеете в виду ... это лучше, чем комментарии или doxygen, когда-либо будут. Вы платите цену, почему бы не получить значение?

15 голосов
/ 26 сентября 2008

Для встроенного программирования разумное использование const при объявлении глобальных структур данных может сэкономить много оперативной памяти, поскольку постоянные данные помещаются в ПЗУ или флэш-память без копирования в ОЗУ во время загрузки.

В повседневном программировании использование const тщательно помогает избежать написания программ, которые аварийно завершают работу или ведут себя непредсказуемо, поскольку они пытаются изменить строковые литералы и другие постоянные глобальные данные.

При работе с другими программистами над крупными проектами правильное использование const помогает предотвратить удушение других программистов.

11 голосов
/ 09 декабря 2009

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

Во многих кодах, которые я пишу, это действительно стоило усилий, потому что мы часто используем композицию:

class A { ... }
class B { A m_a; const A& getA() const { return m_a; } };

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

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

...