C++ — сбивающий с толку язык, на котором сложно писать, а в некоторых отношениях еще труднее читать, особенно если разработчик не придерживается хороших методов программирования. Одним из способов написания лучшего кода на C++ является использование ключевого слова const. Const применяет политику неизменяемости и может использоваться в сочетании как с переменными, так и с методами класса.

Постоянные переменные

Константная переменная — это переменная, которую нельзя изменить, и ее необходимо инициализировать при объявлении, потому что ее нельзя будет изменить позже! Ниже приведен пример константной переменной.

Синтаксис постоянной переменной аналогичен синтаксису любой другой переменной, за исключением введения ключевого слова const, которое добавляется перед определением типа переменной.

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

Постоянные указатели

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

В приведенном выше примере показаны три различных способа применения const. Применение const в любом месте перед «*» указывает, что данные, расположенные по адресу памяти, сохраненному указателем, должны быть постоянными. В этом случае указатель должен указывать на данные, которые определены как константы.

Применение const после «*» указывает, что сам указатель является константным, то есть адрес, хранящийся в указателе, не может быть изменен, что также означает, что указатель должен быть инициализирован при объявлении.

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

Константное в не-константное

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

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

Константные методы

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

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


Примечание: константа включена в сигнатуру функции, что означает, что могут быть созданы два метода: один константный и один не зависящий от объекта, вызывающего метод.

Константы в использовании

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

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

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

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

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

Использование const может помочь реализовать концепцию инкапсуляции, особенно при использовании методов Getter внутри класса. Значение, возвращаемое «по значению» из Getter, не нарушает инкапсуляцию, поскольку обрабатывается копия данных, хранящихся в классе, а не оригинал. Однако если вместо этого возвращается адрес, то объекты вне класса имеют возможность манипулировать данными, хранящимися в классе, что нарушает инкапсуляцию.

Резюме

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

  • использование const для переменной означает, что ее данные нельзя изменить.
  • указатели const могут означать, что данные не могут быть изменены, адрес, который хранит указатель, не может быть изменен, или и то, и другое.
  • Постоянный указатель или ссылка не могут быть присвоены непостоянному значению, потому что это позволит изменить данные, хранящиеся по адресу.
  • Использование const с методами класса не позволяет этому методу изменять элементы данных класса.
  • Const делает код C++ более читабельным и должен использоваться в качестве альтернативы литералам, если они широко используются в программе и не меняются.
  • Использование const помогает определить намерения переменной или метода.
  • Наличие постоянных возвращаемых значений в методах Getter помогает обеспечить инкапсуляцию, гарантируя, что возвращаемое значение не может быть изменено вне класса.