Как объявить константу в классе

Константные переменные — это такие переменные, которые непеременные переменные. Смысл константных сущностей — хранение одного и того же значения внутри своей личины. Понять это, как правило, легко, сложнее новичку принять, что они очень полезны. В случае с обычными переменными константы объявлять и использовать относительно просто. В случае с классами немного всё сложнее. Чтобы никого не запутать, сразу обозначу, что речь идёт о тех константах, которые как обычные переменные, но о таких константах внутри классов.

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

Для проверки требуется поддержка от С++11

Если ваш компилятор уже устаревший или настроен на компиляцию под устаревшие стандарты, то ошибку компиляции спровоцирует само объявление константы в таком виде. Как упоминалось, до некоторого времени так константы объявлять было нельзя. Но тем не менее, кому-то обязательно хочется использовать такой массив. Путей на самом деле несколько, один из которых — использовать указатель, на который завязать конструктор и деструктор, выделять память и чистить память вручную, например. Но С++ позволяет избрать путь попроще: использовать константы. Только-лишь к написанию самих констант нужно подойти немного иначе. Есть как минимум два варианта:

  • Использовать enum
  • Использовать static
Прямой путь ведёт к ошибкам компиляции, потому что сам по себе класс только описывает будущий объект, но не создаёт объекта, а константа требует себе значения существующего. Получается несходство. Пока объект не создан, хранит значение не в чем, а если нет хранилища, то константа не может взять значение, которого нет по причине отсутствия хранилища.
Использование перечисления enum оказывается очень удобным вариантом решения подобной проблемы.

Перечисления как классы могут иметь собственную область видимости. В листинге #2 как и прежде объект не создаётся, а только описывается. Доступ к такой константе можно получить с помощью операции разрешения контекста (двойного двоеточия).

Создадим такой массив:

Листинг #3.1 стоило написать немного иначе, но я специально не стал ничего закрывать, чтобы было наглядно. Использованием двойного двоеточия к имени класса мы смогли вытащить константу, описанную в классе. Этот код будет работать во всех компиляторах. Исключение очень-очень старые, но там проблема не с перечислением, а с использованием заголовочных файлов и отсутствии пространства имён. Сам подход рабочий и этот путь верен для любого компилятора С++ вообще, но с условием, что константа будет целым числом.
Немного усложним код, сделав его более верным. Если код будет сложно понять, то его пока что можно пропустить. Он делает всё то же самое, но применяется чуть более верный подход.

Иногда может быть удобно использовать немного другое описание класса:

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

Не очень хочется громоздить кодами, да и вам подспорье переписать по подобию третьих листингов. Мысль только в том, что константы можно задавать одним списком в enum, после чего их использовать как самые обычные const значения.
К сожалению, на перечислениях enum постоянно какие-нибудь ограничения: это целочисленные константы. Коль скоро это целочисленные константы, на все случаи жизни они подойти не смогут. Второй способ использования констант в классе состоит в том, чтобы использовать static-константы. Статические переменные классов на самом деле глобальные переменные, но сокрытые областью видимости классов. Это можно удобно использовать для имитации константного элемента класса.

По использованию никаких отличий. Различие сокрыто только в том, что enum в показанном способе объекта не создаёт, а статическая переменная значит, что объект будет создан. Перечисление enum просто переписывает встречаемые обозначения на указанные значения.
Очень многие кодеры не запоминают значения в отдельную переменную, а сокращают их. Вот некоторые способы:

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

    Для использования констант (одна константа на весь класс):

  • Можно использовать перечисление enum
    Для использования констант (одна константа на весь класс):

  • Можно использовать static-константу
Что мы узнали?:

  • Перечисление enum представляет из себя только описание, объектов для него не создаётся. Показанные перечислению обозначения переписываются прямо в коде.
  • static-константа, используемая вутри класса, требует для себя определения: ей нужен объект. На самом деле ваш компилятор может справиться и без определения объекта, но это будет работать не во всех компиляторах
  • В С++11 разрешено инициализировать значения прямо на месте внутри класса, так можно даже создать константу, но такая константа имеет некоторые ограничения, из-за чего выбор static-константы или enum иногда предпочтительнее.
Использованные материалы:

Язык программирования C++. Лекции и упражнения. 6-е изд (Стивен Прата)

Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Добавить комментарий

Ваш e-mail не будет опубликован.

1 + 7 =

Поиск

 
     

Случайная книга в электронном формате

https://www.litres.ru/valeriy-laptev/c-ekspress-kurs/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Солидной компании на постоянную работу требуется девушка приятной внешности со знанием Linux, программирование встраиваемых микроконтроллеров на C/C++/ASM, знание Linux - установка и настройка (сеть, графика, установка драйверов); C , Python, технологии ООП, GTK (желательно PyGTK) или Qt, SQL и XML - базовые знания; понимание многопоточности и синхронизации потоков.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок