Как начинающему программисту на C ++, есть некоторые конструкции, которые мне кажутся очень непонятными, одна из них const
. Вы можете использовать его во многих местах и с таким количеством различных эффектов, что новичку практически невозможно выйти живым. Сможет ли какой-нибудь гуру C ++ однажды навсегда объяснить различные варианты использования и / или почему бы не использовать их?
129
Ответы:
Пытаюсь собрать несколько применений:
Связывание некоторого временного объекта со ссылкой на const, чтобы продлить его время жизни. Ссылка может быть базой - и ее деструктор не обязательно должен быть виртуальным - правый деструктор по-прежнему вызывается:
Объяснение с использованием кода:
Этот прием используется в служебном классе Александреску ScopeGuard. Как только временное выходит за пределы области видимости, деструктор Derived вызывается правильно. В приведенном выше коде отсутствуют некоторые мелкие детали, но это главное.
Используйте const, чтобы сообщить другим методам, что они не изменят логическое состояние этого объекта.
Используйте const для классов копирования при записи , чтобы компилятор помог вам решить, когда и когда вам не нужно копировать.
Объяснение : Вы можете захотеть поделиться данными при копировании чего-либо, пока данные исходного и скопированного объекта остаются неизменными. Однако после того, как один из объектов изменит данные, вам понадобятся две версии: одна для оригинала и одна для копии. То есть вы копируете при записи в любой объект, так что теперь у них обоих есть собственная версия.
Используя код :
Приведенный выше фрагмент печатает тот же адрес на моем GCC, потому что используемая библиотека C ++ реализует копирование при записи
std::string
. Обе строки, даже если они являются разными объектами, используют одну и ту же память для своих строковых данных. Созданиеb
неконстантной версии предпочтительнее неконстантной версии,operator[]
и GCC создаст копию буфера резервной памяти, потому что мы можем изменить его, и это не должно влиять на данныеa
!Чтобы конструктор-копия делал копии из константных объектов и временных файлов :
Для создания констант, которые невозможно изменить
Для передачи произвольных объектов по ссылке, а не по значению - чтобы предотвратить возможную дорогостоящую или невозможную передачу по значению
источник
На самом деле есть два основных использования const в C ++.
Постоянные значения
Если значение имеет форму переменной, члена или параметра, которые не будут (или не должны) изменяться в течение своего времени существования, вы должны пометить его как const. Это помогает предотвратить мутации объекта. Например, в следующей функции мне не нужно изменять переданный экземпляр Student, поэтому я помечаю его как const.
Относительно того, зачем вы это сделали. Намного легче рассуждать об алгоритме, если вы знаете, что базовые данные не могут измениться. «const» помогает, но не гарантирует, что это будет достигнуто.
Очевидно, что печать данных в cout не требует особых размышлений :)
Пометка метода члена как const
В предыдущем примере я пометил Student как const. Но как C ++ узнал, что вызов метода GetName () для ученика не приведет к изменению объекта? Ответ в том, что метод был помечен как const.
Маркировка метода "const" делает 2 вещи. В первую очередь он сообщает C ++, что этот метод не будет изменять мой объект. Во-вторых, все переменные-члены теперь будут обрабатываться так, как если бы они были помечены как const. Это помогает, но не мешает вам изменять экземпляр вашего класса.
Это чрезвычайно простой пример, но, надеюсь, он поможет ответить на ваши вопросы.
источник
Постарайтесь понять разницу между этими 4 объявлениями:
Следующие 2 объявления семантически идентичны. Вы можете изменить где CCP1 и CCP2 точку, но вы не можете изменить вещи они указывают.
Затем указатель имеет значение const, поэтому, чтобы иметь смысл, он должен быть инициализирован, чтобы указывать на что-то. Вы не можете указать на что-то еще, но то, на что он указывает, можно изменить.
Наконец, мы объединяем эти два элемента, поэтому указатель не может быть изменен, а указатель не может указывать ни на что другое.
Правило спирали по часовой стрелке может помочь распутать объявление http://c-faq.com/decl/spiral.anderson.html
источник
В качестве небольшого примечания, поскольку я читал здесь , полезно заметить, что
источник