Senior C++ Developer – Telegram
Senior C++ Developer
12.1K subscribers
1.38K photos
3 videos
620 links
Изучаем C++.

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

РКН: https://www.gosuslugi.ru/snet/676e9a1e4e740947beca35ba
Download Telegram
Как в С++ обрабатывать ошибки в конструкторах без исключений?

Самый очевидный способ обработки ошибок — это возврат значений. Но конструкторы не возвращают значения, поэтому так поступить нельзя. Это и было одной из причин, по которой исключения появились в С++.

Смотреть статью
Алгоритм rotate

Меняет местами элементы в диапазоне [first, last) таким образом, что элемент n_first становится первым в новом диапазоне, а n_first-1 — последним.

Параметры:
first, last - диапазон элементов для изменения их порядка.
n_first - элемент, который должен стать первым в новом диапазоне.
Изучение физического движка Bullet Physics. Часть 2. Примеры

Смотреть статью
Кортежи

Как и пара, кортеж представляет собой набор значений фиксированного размера для различных типов данных.

Иногда удобнее использовать std::array вместо кортежа. Такой массив подобен обычному массиву в Си вместе с несколькими функциями стандартной библиотеки C++. Эта структура данных была добавлена в 11 версии C++.
SFINAE (Substitution Failure Is Not An Error)

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

В этом примере функция my_function будет компилироваться только для типов данных, которые являются целочисленными. Если мы передадим в функцию строку, то компиляция завершится неудачей, потому что std::enable_if_t не сможет замениться на допустимый тип.
Инициализатор в if и switch

Вам должна понравиться такая возможность из С++17. Теперь вы можете выполнять инициализацию переменных и проверять условие внутри if или switch. Это даёт сделать код более лаконичным и чистым. Общая форма:

if (init-statement(x); condition(x)) {
// some code
}
else { // в else тоже видно x
// some more code
}
#вопросы_с_собеседований
Что за оператор −−> в С++?

Это старый хитрый вопрос. В С++ нет оператора −−>.

Рассмотрим такой код:

if (p−−>m == 0) f(p);

Выглядит так, как будто и правда есть оператор −−>, и если правильно объявить переменные p и m, то код даже скомпилируется и запустится:

int p = 2;
int m = 0;
if (p−−>m == 0) f(p);


Это означает: если p−− больше чем m (а это так), то надо сравнить результат (true) с нулём. Ну, true != 0, так что результат всего выражения — false, и функция f() не вызовется. Другими словами:

if ((p−−) > m == 0) f(p);

Пожалуйста, не тратьте много времени на подобные вопросы. Они сбивали с толку новичков ещё до того, как появился С++.
Функция all_of

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

В приведенном выше коде отрицательный элемент -6 отрицает условие и возвращает false.
Различие локальной переменной и поля класса с одинаковым именем

Указатель this может быть полезен в случае, когда локальная переменная в методе имеет то же самое имя, что и поле объекта:

void set(int x) { this->x = x; }

Здесь в методе set мы присваиваем полю класса x значение локальной переменной this. Чтобы различить поле класса x и локальную переменную с тем же именем мы используем запись this->x при обращении к полю класса.
Что за ошибка в приведенном ниже коде и как ее исправить?

my_struct_t *bar;
/* ... делаем что-то, включая указание bar на определенный объект my_struct_t */
memset(bar, 0, sizeof(bar));

Последним аргументом memset должен быть sizeof(*bar), а не sizeof(bar). sizeof(bar) вычисляет размер bar (то есть самого указателя), а не размер структуры, на которую указывает bar. Поэтому код можно исправить, используя sizeof(*bar) в качестве последнего аргумента вызова memset.
Друзья, с наступающим Новым годом! 🎄
Спасибо, что вы с нами.

2025-й отлично показал, как быстро меняется индустрия: за год вышли новые думающие модели, которые сильно прокачали кодинг, анализ и мультимодальность.

Пусть 2026 принесёт вам спокойные релизы без ночных авралов, понятные ТЗ, сильные команды и проекты, которыми реально хочется гордиться. Пусть баги ловятся быстро, деплой проходит с первого раза, а нейросети становятся не магией, а надёжным инструментом в вашем рабочем наборе 😄
Счастья, здоровья и стабильного интернета — увидимся в новом году! 🚀💻🎉
Алгоритм generate

Используется для генерации чисел на основе функции генератора, а затем присваивает эти значения элементам в контейнере в диапазоне [first, last).
#вопросы_с_собеседований
Сколько раз будет выполняться этот цикл?

Если бы вы сказали 300, а i был объявлен как int, вы были бы правы. Но поскольку i объявлен как unsigned char, правильный ответ – зацикливание (бесконечный цикл).

Объясняем. Выражение 2 * half_limit будет повышаться до int (на основе правил преобразования C++) и заимеет значение 300. Но так как i – это unsigned char, он пересматривается по 8-битному значению, которое после достижения 255 будет переполняться, поэтому вернется к 0, и цикл будет продолжаться вечно.
Пчела на работе, разработка игр на SFML C++

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

Смотреть статью
Алгоритм is_sorted_until

Используется для определения первого несортированного элемента в диапазоне [first, last). Он возвращает итератор к первому несортированному элементу в диапазоне, поэтому все элементы между первым и возвращенным итератором сортируются.

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

Вы можете определить свои собственные исключения, наследуя и переопределяя функциональные возможности класса исключений. Ниже приведен пример, который показывает, как вы можете использовать класс std :: exception для реализации своего собственного исключения стандартным способом

Это приведет к следующему результату -
MyException caught
C++ Exception

Здесь what() - это открытый метод, предоставляемый классом исключений, и он был переопределен всеми дочерними классами исключений. Это возвращает причину исключения.
#вопросы_с_собеседований
Сколько раз будут выполняться циклы внутри программы?

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

Объяснение:
В первом цикле условие прекращения цикла имеет тип беззнакового char, значит, у нас присвоение n 256 вызовет переполнение и n станет равным 0. Цикл превратится в for(unsigned char i = 0; i < 0; ++i), а, значит, условие цикла не выполняется, и мы даже не войдём в тело цикла. Во втором цикле другая ситуация, он превращается в for(unsigned char i = 0; i < 256; ++i), и так как i не может быть больше, чем 255, то условие цикла будет выполняться всегда.
Узнаем версию C++

Можно использовать макрос __cplusplus для определения версии C++. Например, если препроцессор увидит значение __cplusplus, равное 199711L, это означает, что используется C++98; значение 201103L указывает на C++11 и так далее.
Функция resize

Изменяет размер контейнера так, чтобы он содержал n элементов.

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

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

Если n также больше, чем текущая вместимость контейнера, происходит автоматическое перераспределение выделенного пространства для хранения.