Senior C++ Developer
12K subscribers
1.4K photos
3 videos
623 links
Изучаем C++.

По вопросам сотрудничества: @adv_and_pr

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
Ключевое слово auto

autoэто тип вывода, который позволяет компилятору автоматически определять тип переменной на основе выражения инициализации.
Он был введен в C++11 для упрощения объявления переменных, избавляя от необходимости указывать длинные и сложные типы.

При использовании auto тип переменной выводится компилятором во время компиляции и не может меняться во время выполнения.
Работает для любых типов данных — встроенных, пользовательских, шаблонов.

Переменная, объявленная с auto, всегда инициализируется при объявлении.

auto полезен при работе с итераторами, с функциями возврата сложных типов, для упрощения кода.

#это_база
#вопросы_с_собеседований
Как изменить поле класса в константном методе класса?

В константном методе класса нельзя изменить значение поля, объявленного как const.
Однако, можно изменить поле, объявленное без ключевого слова const, даже внутри const метода. Хотя это и не рекомендуется, так как нарушает идею неизменяемости объекта в константном контексте.

Чтобы все же иметь возможность модифицировать поля внутри const метода, можно объявить нужные поля как mutable. Тогда компилятор разрешит изменять эти поля, даже если вызов осуществляется на константный объект и из константного метода.
Но использование mutable стоит ограничивать, по возможности избегая. Лучше пересмотреть структуру класса, чтобы константные методы не нуждались в изменении полей.
std::any_cast

std::any_cast используется для приведения объектов типа std::any к конкретному типу данных во время выполнения программы.

Класс std::any может хранить данные любого типа, но при этом теряется информация о реальном типе данных.
Чтобы получить эти данные обратно в изначальный тип, и используется std::any_cast. Он проверяет, совместим ли хранимый в std::any объект с запрошенным целевым типом.
Если совместим — возвращает ссылку на данные нужного типа.

Например, если в std::any был помещен объект типа int, то с помощью std::any_cast этот int можно получить обратно в переменную типа int. Аналогично для других типов данных.
#вопросы_с_собеседований
Что будет, если дважды вызвать free?

Если вызвать free два раза для одного и того же участка памяти, это приведет к неопределенному поведению программы и скорее всего к ее аварийному завершению.

При первом вызове free освобождается участок памяти и возвращается в кучу для последующего выделения.
При повторном вызове для того же участка менеджер памяти попытается освободить уже освобождённую область.

Это приведет к повреждению структур данных менеджера памяти и неопределенному поведению — от тихих ошибок вроде утечек памяти, до полного сбоя и аварийного завершения программы.
string.back

Эта функция возвращает ссылку на последний символ строки.
Она позволяет получить доступ к последнему символу строки и при необходимости изменить его.

Возвращаемое значение имеет тип символа строки, обычно char или wchar_t. Если строка пустая, то поведение функции неопределенно, поэтому нужно проверять, что строка не пуста, прежде чем вызывать back().

string.back часто используется в циклах для обработки символов строки с конца или для проверки последнего символа.

#это_база
Исключение std::bad_any_cast

Исключение std::bad_any_cast выбрасывается при неудачной попытке приведения типа any к другому типу. Это происходит, когда тип, к которому производится приведение, не соответствует реальному типу объекта, хранящегося в any.

Например, если в any хранится объект типа int, а мы пытаемся привести его к типу std::string, то будет выброшено исключение bad_any_cast.
Это исключение позволяет обнаружить ошибки при использовании any во время выполнения программы.

Таким образом, bad_any_cast гарантирует типобезопасность при работе с any и указывает на то, что при приведении типов была допущена ошибка.
Чтобы избежать этого исключения, нужно проверять тип объекта в any с помощью any_cast перед приведением типа.
void указатели

Void указатель (void*) — это не типизированный указатель, который может указывать на объект любого типа.
Void указатели могут приводиться к любому другому типу указателей и обратно без явного преобразования.

Арифметические операции недопустимы для void указателей, так как компилятор не знает размер объекта в памяти. При их использовании нужно следить за типобезопасностью и правильностью приведений типов.

В основном void указатели используются для обобщенной работы с указателями разных типов. Например, в функциях реализующих общие алгоритмы.

#это_база
Алгоритм nth_element

Перестраивает список таким образом, что элемент в n-й позиции — это тот элемент, который должен быть в этой позиции, если мы сортируем список.
Алгоритм search

Ищет последовательность [first1, last1) для первого вхождения подпоследовательности, определенной [first2, last2), и возвращает итератор в свой первый элемент вхождения, или last1, если вхождения не найдены.
Wt

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

Кроме того, Wt предоставляет модель событий на стороне сервера, которая позволяет разработчикам писать веб-приложения, обладающие высокой отзывчивостью и интерактивностью.

https://www.webtoolkit.eu/wt
Удаление элементов

Для удаления элементов из контейнера list могут применяться следующие функции:

clear(p): удаляет все элементы

pop_back(): удаляет последний элемент

pop_front(): удаляет первый элемент

erase(p): удаляет элемент, на который указывает итератор p. Возвращает итератор на элемент, следующий после удаленного, или на конец контейнера, если удален последний элемент

erase(begin, end): удаляет элементы из диапазона, на начало и конец которого указывают итераторы begin и end. Возвращает итератор на элемент, следующий после последнего удаленного, или на конец контейнера, если удален последний элемент

Применение всех функций представлено на картинке.