TGViewer
Channel Public Channel
EBFE: software internals

EBFE: software internals

@ebfecode

Авторский канал Алексея Никольского.
Пишу код операционок и гипервизоров больше 20 лет и читаю лекции студентам.
Делюсь своими мыслями, интересными материалами, мемасиками и всегда рад общению!

Моя мастерская: https://t.me/itmosysint
Subscribers
433
Photos
352
Videos
62
Links
122

Showing posts older than #4 · Back to latest

Older Posts 3 shown
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
Post #2 159
Post #1
Channel created
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 →