Senior C++ Developer – Telegram
Senior C++ Developer
12.3K subscribers
1.36K photos
3 videos
609 links
Изучаем C++.

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

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
Отличия перегрузки оператора от перегрузки функций

Перегрузка операторов позволяет определить поведение встроенных операторов (+, -, *, / и т. д.) для пользовательских типов данных.
— Перегрузка функций позволяет определить несколько функций с одинаковым именем, но разными параметрами.

Перегрузка операторов определяется внутри класса, а перегрузка функций — вне класса.

Перегруженные операторы могут быть как членами класса, так и глобальными функциями. Перегруженные функции могут быть только глобальными.

#это_база
Метод crbegin

Метод crbegin() возвращает итератор на обратный конец контейнера, то есть на элемент перед началом контейнера.
Он определен для стандартных контейнеров в C++, таких как std::vector, std::list, std::deque и другие.

Итератор crbegin() итерирует элементы контейнера в обратном порядке — от конца к началу.
Для получения итератора на начало в обратном направлении используется метод crend().

Методы crbegin() и crend() аналогичны методам rbegin() и rend(), но возвращают константные итераторы для константных контейнеров.

#это_база
spaceship operator

Spaceship operator (<=>) — это оператор сравнения, введенный в C++20.

Преимущества spaceship operator:
— Позволяет создавать типы, которые можно сравнивать с помощью одного оператора вместо нескольких (==, !=, <, > и т. д.).
— Упрощает написание функций сравнения, например std::sort.
— Читабельнее и компактнее кода с традиционными операторами сравнения.
using-декларации

Using-декларации используются для импорта имен в текущую область видимости.
Они позволяют избежать необходимости квалифицировать имена из других пространств имен при использовании.

Основные моменты о using-декларациях:

— Позволяют импортировать отдельные имена, например классы, функции или константы.
— Могут применяться как внутри блоков кода, так и вне их. Вне блоков имена импортируются в глобальную область видимости.
— Не импортируют всё пространство имен целиком, в отличие от директив using namespace.
— Помогают избежать конфликтов имен из разных пространств.
#вопросы_с_собеседований
Как расширить STL-контейнеры?

— Создать собственный контейнер, реализовав нужные интерфейсы. Это позволит использовать его с алгоритмами STL.

— Наследоваться от существующих контейнеров и добавить нужный функционал.

— Создать обертку (wrapper) вокруг std контейнера, добавляя в нее нужные методы и функциональность.

— Использовать политику (policy-based design), определяя класс-политику, который будет кастомизировать поведение контейнера.

— Для ассоциативных контейнеров, таких как std::map, можно определить собственный компаратор (compare) для кастомной сортировки.

— Реализовать собственные аллокаторы памяти, если нужно изменить стратегию выделения памяти для контейнера.
Ссылки

Ссылки
- это альтернативные имена для существующих переменных. Переменная может быть объявлена как ссылка, используя символ &.
Ссылка может быть определена как тип переменной, который может действовать как ссылка на другую переменную.

Символ & используется для обозначения адреса переменной или любой памяти. Переменные, связанные со ссылочными переменными, могут быть доступны как по имени, так и по ссылочной переменной, связанной с ними.

#это_база
#вопросы_с_собеседований
Чем отличается мьютекс от семафора?

— Семафор может принимать любое неотрицательное целое значение, мьютекс — только 0 или 1.

— Семафор используется для синхронизации потоков и ограничения доступа к общим ресурсам. Мьютекс — только для взаимного исключения потоков.

— Операции с семафором: wait/signal. С мьютексом: lock/unlock.

— Ожидание семафора можно прервать. Блокировка мьютекса — непрерывная.

— Семафоры можно использовать для реализации ограниченных ресурсов, счетчиков, барьеров. Мьютексы — только для взаимного исключения.

— Мьютекс может быть рекурсивным, семафор — нет.

— Использование семафора часто требует больше кода и аккуратности чем мьютекса.
Метод map::emplace_hint

Метод map::emplace_hint — это оптимизированный способ вставки элемента в ассоциативный контейнер std::map.
Он позволяет конструировать объект прямо в памяти контейнера, избегая лишних копирований.

Метод принимает хинт — итератор, указывающий приблизительное место вставки, использует его для оптимизации поиска нужного места вставки. Затем возвращает пару (итератор на вставленный элемент, флаг успешности вставки).

#это_база
isalpha()

Функция isalpha() проверяет, является ли символ буквой. Она определена в заголовочном файле <ctype.h>.

Функция принимает символ как аргумент и возвращает логическое значение — true, если символ является буквой латинского алфавита и false — для небуквенных символов.
Может распознавать как строчные, так и прописные буквы.

#это_база
Спецификатор доступа default

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

Если при объявлении члена класса не указан спецификатор (public, private, protected), по умолчанию считается default.

В примере x объявлен без спецификатора доступа, значит его видимость по умолчанию — private. А y явно помечен как public и доступен извне класса.
Таким образом, default позволяет не писать лишний private при объявлении членов класса.
std::enable_if

std::enable_if — это шаблон, который позволяет условно включать функциональность в зависимости от удовлетворения какого-либо условия.
Шаблон определен в заголовочном файле <type_traits> и позволяет "включить" код, если некое условие истинно, и "выключить", если ложно.

Часто используется для метапрограммирования — принятия решений на этапе компиляции, а также для перегрузки шаблонных функций.

В примере enable_if включит реализацию is_even только для целочисленных T. Для не целых типов компиляция завершится с ошибкой.
Таким образом, enable_if позволяет гибко управлять логикой и функциональностью на этапе компиляции.
#вопросы_с_собеседований
Что такое TDD?

TDD (Test-Driven Development) — это подход к разработке программного обеспечения, при котором сначала пишутся автоматические тесты, определяющие желаемое поведение кода, а затем реализуется минимально необходимый код, чтобы пройти эти тесты.

Основные принципы TDD:
— Написание теста перед кодом: сначала пишется тест, определяющий желаемую функциональность. Затем пишется минимальный код, чтобы пройти этот тест.
— Рефакторинг: после прохождения теста код рефакторится для улучшения структуры и читаемости, при этом все тесты должны оставаться пройденными.
— Повторение: цикл повторяется — новый тест, код, рефакторинг.
— Тесты должны быть автоматизированными и запускаться очень часто.

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

Модульные тесты проверяют отдельные модули или компоненты системы по отдельности. Они позволяют протестировать корректность работы каждой единицы кода, независимо от остальной системы.

Интеграционные тесты проверяют работу нескольких модулей совместно, их взаимодействие. Цель - убедиться в корректной интеграции разных компонентов между собой.
Метод map::max_size()

Метод map::max_size() возвращает максимально возможное количество элементов, которое может содержать объект map.

Этот метод часто используется для проверки, не превышает ли текущий размер контейнера map его максимальный размер.

В этом примере сначала получаем максимальный размер контейнера mymap с помощью max_size(). Затем добавляем 100 элементов и выводим текущий размер.

#это_база
Метод find_last_not_of

Метод find_last_not_of ищет последнее вхождение символа в строке, которое не совпадает ни с одним символом из указанной маски поиска.

Этот метод часто используется для поиска последнего символа в строке, отличного от заданного. Он принимает в качестве аргументов строку для поиска, маску поиска и опционально позицию, с которой начинать поиск.

Метод возвращает позицию найденного символа или npos, если такого символа нет.

#это_база
std::ranges::input_range

std::ranges::input_range — это концепция в библиотеке std::ranges, которая представляет диапазон элементов, из которого можно последовательно считывать значения.
Она позволяет итерироваться по диапазону при помощи range-based for loop или итераторов.

Имеет begin()/end() методы, возвращающие итераторы на начало и конец диапазона.

Input_range часто используется для представления последовательностей элементов, к которым нужен последовательный доступ для чтения.
Концепт Derived

Концепт std::derived_from используется для проверки того, является ли один тип производным от другого. Он был введен в C++20.
Концепт позволяет проверить, является ли тип Т производным от базового типа. Может использоваться в качестве ограничения шаблона для разрешения использования только производных типов

Заменяет использование std::is_base_of в коде шаблонов и часто применяется для указания в шаблонах и концептах, что параметр T должен быть производным от некоторого базового типа.
#вопросы_с_собеседований
Что такое флажки компиляции?

Флажки компиляции — это специальные опции, которые можно указать при компиляции кода, чтобы включить или отключить определенные возможности языка или библиотек.

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

Например:
std=c++11: включает поддержку стандарта C++11.
O2: включает оптимизацию кода на уровне O2.
g: добавляет отладочную информацию в скомпилированный файл.
Wall: включает предупреждения обо всех возможных ошибках.
DDEBUG: определяет макрос DEBUG, чтобы можно было использовать условную компиляцию.
I<path>: добавляет директорию по указанному пути в поиск заголовочных файлов.
#вопросы_с_собеседований
Что такое специализация шаблона?

Специализация шаблона — это возможность создать отдельную реализацию шаблонной функции или класса для конкретных типов параметров. Это позволяет оптимизировать шаблонные решения для частных случаев.

Например, можно создать специализацию std::vector для bool, которая будет хранить данные в битовых полях, а не как отдельные элементы.

При вызове шаблона компилятор будет искать специализацию для конкретных типов и использовать ее, если она есть. В противном случае используется обобщенная реализация.
Метод wcscmp()

Метод wcscmp() используется для сравнения двух строк, представленных в виде указателей на символы типа wchar_t.

Метод принимает два указателя на нуль-терминированные строки типа wchar_t, сравнивает строки побайтово и возвращает 0, если строки идентичны, положительное число, если первая строка больше второй, или отрицательное число, если первая строка меньше второй.

Работает так же, как стандартная функция strcmp(), но для строк типа wchar_t.

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

Алгоритм lexicographical_compare используется для лексикографического сравнения двух диапазонов элементов, таких как векторы или строки. Он находится в заголовочном файле <algorithm>.

Алгоритм принимает 2 диапазона элементов для сравнения, сравнивает элементы попарно, используя оператор < и возвращает true, если первый диапазон меньше второго, или false в противном случае.

Работает для любых типов данных, которые можно сравнивать с помощью <.

#это_база