Библиотека собеса по C++ | вопросы с собеседований
4.59K subscribers
403 photos
2 videos
184 links
Вопросы с собеседований по C++ и ответы на них.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/9ccf302b

Для обратной связи: @proglibrary_feeedback_bot
Download Telegram
Для чего нужен std::string::at?

std::string::at можно использовать для извлечения символов по символам из заданной строки. Подробнее ознакомиться можно здесь.
August 22, 2023
Отличия между указателем и массивом?

Массивы создаются в статической памяти или в стеке. Указатели могут указывать на любой тип в памяти. В массивах можно изменять содержимое, а по указателю не всегда.
August 23, 2023
В чем отличие overload и overried?

Ответ:
overload — это перегрузка, два одинаковых имени функций с разными принимаемыми аргументами, override — это переопределение (с помощью таблицы виртуальных функций), изменение поведения функции в выведенном классе (с помощью механизма виртуальных функций).
August 24, 2023
Могут ли ссылки отсылать к недопустимому местоположению в памяти в C++?

В C++ ссылки более безопасны, чем указатели, потому что ссылки должны быть инициализированы, и их нельзя изменить, чтобы ссылаться на что-то другое после инициализации. Но есть исключения, когда у нас могут быть недействительные ссылки.
Но есть пара исключений, когда у нас могут быть недействительные ссылки. Они приведены на картинке.
August 25, 2023
August 26, 2023
Что дают разные модификаторы при наследовании?

Ответ:
Изменяют зону видимости членов базового класса.
При private наследовании protected и public члены становятся private. При protected наследовании public становится protected. А при public ничего не изменяется.
August 26, 2023
Для чего нужен алгоритм generate?

Используется для генерации чисел на основе функции генератора, а затем присваивает эти значения элементам в контейнере в диапазоне [first, last).
August 27, 2023
К чему приводит удаление указателя NULL?

Удаление указателя NULL не приводит к каким-либо изменениям и ошибкам.
August 28, 2023
Как сгенерировать pure virtual function call исключение?

Нужно вызвать чисто виртуальный метод в конструкторе родительского класса, то есть до создания дочернего, в котором этот метод реализован. Так как современный компилятор не даст это сделать напрямую, то нужно будет использовать промежуточный метод.
August 29, 2023
Когда следует использовать виртуальное наследование?

Хотя идеально вообще избегать виртуального наследования (вы должны знать, как будет использоваться ваш класс), все же важно иметь четкое представление о том, как работает виртуальное наследование:

Итак, когда у вас есть класс (класс A), который наследуется от двух родителей (B и C), оба из которых имеют общего родителя (класс D), как показано на картинке. Если вы не используете виртуальное наследование в этом случае, вы получите две копии D в классе A: одну из B и одну из C. Чтобы это исправить, вам нужно изменить объявления классов C и B на виртуальные:
class C: virtual public D {
};

class B: virtual public D {
};
August 30, 2023
Что быстрее: постфиксные инкрементные операторы или префиксные? Чем отличается их сигнатура?

Префиксные операторы быстрее. В постфиксных операторах производится дополнительная операция сохранения предыдущего состояния объекта, а затем только увеличение на 1, а в префиксном операторе после инкрементирования объекта, сразу возвращается ссылка объект.

Сигнатура их отличается фиктивным параметром int у постфиксного оператора.
August 31, 2023
Что такое хеш-функция? Объясните на примере

Хеш-функция — это функция, которая принимает на вход некоторые данные и возвращает фиксированный размер выходных данных, называемый хешем. Такие функции широко используются в C++ для решения задач с поиском и индексированием данных. Они позволяют быстро находить элементы в массивах или хранилищах данных.

Рассмотрим применение на примере кода выше:
Мы создаем объект хеш-функции для строки и используем его для вычисления хеша для строки "Hello, world!". Результатом выполнения программы будет вывод на экран хеш-значения для этой строки.
September 1, 2023
Что такое void указатель? Можно ли разыменовать указатель void, не зная его типа?

void указатель — это указатель, который можно использовать для указания на любые данные любого произвольного типа. Указатель void может быть разыменован только после явного приведения. Например:
int a = 5;
void *b = &a;
printf(“%d\n”, *((int*)b));
September 2, 2023
Что такое виртуальный деструктор и зачем он используется в C++?

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

Если виртуального деструктора не объявлено в базовом классе, то при удалении производного объекта через указатель на базовый класс будут вызваны только деструкторы базового класса, что может привести к утечкам памяти и неопределенному поведению.
September 3, 2023
Бывает такое, что оператор new не выделяет память?

Ответ:
Да, бывает, когда new передаётся указатель на уже выделенную память (например, с помощью malloc). Это называется placement new. И оператор new без изменения возвращает второй параметр - указатель (void* operator new(std::size_t, void*)). Это используется для создания объектов в выделенном "хранилище" или после malloc.

Важно! В этом случае деструктор нужно вызывать самостоятельно!
September 4, 2023
Что делает алгоритм move?

Синтаксис:
std::move(first, last, result);

Перемещает элементы диапазона [first,last) в диапазон, начиная с позиции result.

Значение элементов в [first,last) массиве передается элементам, на которые указывает result. После вызова элементы в диапазоне [first,last) остаются в неопределенном, но допустимом состоянии.
September 5, 2023
Что такое класс хранения?

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

В C++ поддерживаются такие классы хранения: auto, static, register, extern и mutable.

Обратите внимание, что register устарел для C++11. Для C++17 он был удален и зарезервирован для будущего использования.
September 6, 2023
Что такое rvalue, lvalue?

lvalue — это всё, что имеет имя, rvalue — это то, что имени не имеет. Исторически сложились такие названия, потому что lvalue всегда было то, что писалось с левой стороны присваивающего выражения, а rvalue — это то, что появлялось только справа от этого выражения.
September 7, 2023
Как проверить, является ли число степенью двойки?

Мы можем проверить, является ли число степенью двойки или нет напрямую, используя код выше.
September 8, 2023
Как узнать факториал числа?

Решение приведено на картинке.
September 9, 2023
Объясните ключевые слова mutable и volatile.

Ключевое слово volatile сообщает компилятору, что переменная может измениться без ведома компилятора. Переменные, объявленные как volatile, не будут кэшироваться компилятором и, таким образом, всегда будут считываться из памяти.

Ключевое слово mutable можно использовать для переменных-членов класса. Изменяемые переменные могут меняться из константных функций-членов класса.
September 10, 2023