TGViewer
EBFE: software internals EBFE: software internals @ebfecode · 433 subscribers
Post #3 164
Язык C++ действительно - это очень мощный инструмент, и требует от программиста не только знаний но и чувства прекрасного. Все верно говорил А. Н. Туполев о том, что некрасивый самолёт не полетит, это верно во многих инженерных дисциплинах, и программирование не исключение.
Одно из преимуществ C++, это наличие встроенных в язык конструкций для создания ограничений (constraints). Тут вам и области видимости (public, protected, private), и конечно же ключевое слово const. Но штука в том, что почему-то почти на каждое ограничение есть способ его отменить. Я не говорю про вариант закастить что угодно в (void*) и погнали - тут уж никакой private не спасет, а о тех средствах что встроены в язык - на private есть ключевое слово friend, а на слово const есть const_cast и ключевое слово mutable. Про последнее и речь.
Например, сделаем класс:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() { return x + y; } };
Если внимательно посмотреть на класс,то просится само собой поставить ограничение const на метод summ - поскольку он ничего не меняет в состоянии класса. Сделано:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() const { return x + y; } };
Теперь мы не можем написать что-то типо такого:
class A { int x; int y; int c; void increment() { x++; y++; c++; } int summ() const { с++; return x + y; } };
Компилятор нас остановит от такой роковой ошибки - и напишет все то что о нас думает....Мы теперь можем возмутиться и проучить компилятор с помощью слова mutable:
class A { int x; int y; mutable int c; void increment() { x++; y++; c++; } int summ() const { с++; return x + y; }};
Ура! Мы победили!
Если серьёзно, то слово mutable позволяет менять поля, помеченные им, даже в константных методах. Надеюсь всем понятно, что разработчики C++ отнюдь не идиоты и добавили целое ключевое слово не для того, чтобы мы смогли победить назойливый компилятор (как-нибудь напишу про это подробнее). В чем же дело?А дело в формулировке: const у метода класса не позволяет методу менять состояние класса! То есть слово mutable помечает поля, которые не относятся к состоянию класса. Это как? Класс же описывает объекты, а объект = состояние, поведение и идентичность. Где тут что-то еще? Все очень просто: например вам нужен отладочный счётчик, чтобы посмотреть как часто вызывается метод в объектах; или вам надо закэшировать предварительно посчитанные значения или данные, итд. То есть, чаще всего речь о служебных функциях, или об оптимизации. Это очень классно, ведь в сложных и больших проектах такая тема встречается очень часто - и разработчики C++ об этом знают, поэтому добавили такое ключевое слово, чтобы вам не пришлось переписывать пол системы и снимать важные ограничения (убирать const - так не надо делать), из-за отладочного счётчика, который вам вдруг понадобился.
Очевидно, такая гибкость и свобода дает программисту не только мощь, но и ответственность - код надо писать внимательно и соблюдать баланс, и не делать так, как я в шуточном примере)
Всем интересных инженерных задач и красивых реализаций!
  • 💋 6
  • 👍 2
More from @ebfecode
  1. Oct 10, 2026Doom на языке Brainfuck — уже в открытом доступе! 💻 Мы скомпилировали легендарный DOOM в…
  2. Oct 10, 2026Надо такую хрень настроить - прикол конечно...
  3. Oct 10, 2026video post
  4. Oct 9, 2026⚡️HardCore Lab: запуск сезона нового hardware-направления ФБИТ ИТМО Здесь будем разбиратьс…
  5. Oct 9, 2026Главная мысль такая: чтобы лучше понять мир не нужно замыкаться только на условном кодинге…
  6. Oct 9, 2026Возвращаемся к сотрудникам. Я не буду работать с человеком (даже если он супер квалифициро…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →