Язык C++ действительно - это очень мощный инструмент, и требует от программиста не только знаний но и чувства прекрасного. Все верно говорил А. Н. Туполев о том, что некрасивый самолёт не полетит, это верно во многих инженерных дисциплинах, и программирование не исключение.
Одно из преимуществ C++, это наличие встроенных в язык конструкций для создания ограничений (constraints). Тут вам и области видимости (public, protected, private), и конечно же ключевое слово const. Но штука в том, что почему-то почти на каждое ограничение есть способ его отменить. Я не говорю про вариант закастить что угодно в (void*) и погнали - тут уж никакой private не спасет, а о тех средствах что встроены в язык - на private есть ключевое слово friend, а на слово const есть const_cast и ключевое слово mutable. Про последнее и речь.
Например, сделаем класс:
Если внимательно посмотреть на класс,то просится само собой поставить ограничение const на метод summ - поскольку он ничего не меняет в состоянии класса. Сделано:
Теперь мы не можем написать что-то типо такого:
Компилятор нас остановит от такой роковой ошибки - и напишет все то что о нас думает....Мы теперь можем возмутиться и проучить компилятор с помощью слова mutable:
Ура! Мы победили!
Если серьёзно, то слово mutable позволяет менять поля, помеченные им, даже в константных методах. Надеюсь всем понятно, что разработчики C++ отнюдь не идиоты и добавили целое ключевое слово не для того, чтобы мы смогли победить назойливый компилятор (как-нибудь напишу про это подробнее). В чем же дело?А дело в формулировке: const у метода класса не позволяет методу менять состояние класса! То есть слово mutable помечает поля, которые не относятся к состоянию класса. Это как? Класс же описывает объекты, а объект = состояние, поведение и идентичность. Где тут что-то еще? Все очень просто: например вам нужен отладочный счётчик, чтобы посмотреть как часто вызывается метод в объектах; или вам надо закэшировать предварительно посчитанные значения или данные, итд. То есть, чаще всего речь о служебных функциях, или об оптимизации. Это очень классно, ведь в сложных и больших проектах такая тема встречается очень часто - и разработчики C++ об этом знают, поэтому добавили такое ключевое слово, чтобы вам не пришлось переписывать пол системы и снимать важные ограничения (убирать const - так не надо делать), из-за отладочного счётчика, который вам вдруг понадобился.
Очевидно, такая гибкость и свобода дает программисту не только мощь, но и ответственность - код надо писать внимательно и соблюдать баланс, и не делать так, как я в шуточном примере)
Всем интересных инженерных задач и красивых реализаций!
Одно из преимуществ 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
Я включил комментарии. Можно сюда писать для предыдущего поста
🍌2
Задачка на ночь.
В одну строку препроцессора С добавьте во все printf в начале того, что он печатает - номер строки, на которой используется printf. (Правильный ответ будет в воскресенье).
В одну строку препроцессора С добавьте во все printf в начале того, что он печатает - номер строки, на которой используется printf. (Правильный ответ будет в воскресенье).
🤔1
EBFE: software internals
Задачка на ночь. В одну строку препроцессора С добавьте во все printf в начале того, что он печатает - номер строки, на которой используется printf. (Правильный ответ будет в воскресенье).
Конкретизирую. Есть код на несколько тысяч строк. В коде используется много printf. Нaпример:
Задача добавить где-то в начале файла некий макрос #define, который бы все такие printf поменял бы так, чтобы перед каждым текстом печатался бы номер строки на которой этот printf объявлен. Из примера печатать должен Типо так:
printf("Setting parameter %d = %x!", i, val); Задача добавить где-то в начале файла некий макрос #define, который бы все такие printf поменял бы так, чтобы перед каждым текстом печатался бы номер строки на которой этот printf объявлен. Из примера печатать должен Типо так:
345: Setting parameter 5 = f!🤔3
Media is too big
VIEW IN TELEGRAM
#этобаза Базовая настройка проектов Visual Studio для C/C++
💋4❤🔥3
Media is too big
VIEW IN TELEGRAM
#этобаза Рассказ о том как работают настройки проектов а Visual Studio
💋4❤🔥3
(Только для магов) Расскажите, что вы знаете
Anonymous Poll
72%
Я знаю синтаксис С
47%
Я водил на С разные программы
58%
Я использовал printf, fopen, fread
47%
Я использовал malloc, free
64%
Я кодил на С в Visual Studio
😢2🌭2🍓2😈1
Пробую разные форматы. Через какое-то время проведём опрос, чтобы понять, что заходит, а что нет
👍4👨💻2🥰1🕊1🤝1
Кстати, если знаете людей, которым такие материалы были бы интересны, то приглашайте. Если у вас ссылка не сохранилась, то дам.
😁3👍1🆒1
И ещё: постепенно планируют добавлять материалы и более сложные. Их есть у меня.
❤5😈4😢2
