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

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

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

Работать у нас: https://job.proglib.io/

Наши каналы: https://yangx.top/proglibrary/9197
加入频道
Почему стоит использовать std::swap вместо прямого обмена значений?

Использование std::swap вместо прямого обмена значений может быть более эффективным, так как std::swap может быть специализирован для определенных типов данных.
Это означает, что для некоторых типов данных может существовать более эффективная реализация std::swap, которая будет использоваться вместо общей реализации.

Также использование std::swap улучшает читаемость кода и делает его более ясным для других разработчиков.
Расскажите об использовании realloc в контейнерах.

realloc используется в контейнерах динамической памяти, таких как vector, для изменения выделенной памяти при добавлении или удалении элементов.

realloc вызывается при заполнении текущего буфера в контейнере и память перевыделяется большими блоками (обычно в 2 раза больше). Это позволяет избежать постоянного выделения памяти заново.
Само перевыделение происходит автоматически, скрыто от разработчика.

При частых вызовах может привести к фрагментации памяти.
Что такое модульные тесты?

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

Целью модульных тестов является убеждение в том, что каждый компонент работает как задумано и не вызывает ошибок или нежелательного поведения.
Для чего используется вызов throw без аргументов?

Для повторного возбуждения предыдущего исключения и направления его следующему обработчику.
В чем разница между указателем и ссылкой в C++?

Указатель может быть переназначен n раз, в то время как ссылка не может быть переназначена после бинда. Указатели могут указывать в NULL, тогда как ссылка всегда ссылается на объект. Программист не может получить адрес ссылки, как это возможно с указателями, но можно взять адрес объекта, на который указывает ссылка, и выполнить действия с ним.
Что такое variadic templates?

Variadic templates — это функция шаблонов, которая позволяет определить функцию или класс с переменным количеством аргументов.
Эта возможность появилась в C++11.

Variadic templates позволяют создавать функции, которые могут принимать произвольное количество аргументов, не зная заранее их типов.
Это достигается за счет использования упаковки аргументов (pack expansion) и рекурсивных шаблонов.

Проще говоря, variadic templates расширяют возможности шаблонов и позволяют создавать гибкие и универсальные компоненты.
Возможно ли иметь рекурсивную встроенную функцию?

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

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

Ответ:
Class B
Программа верна, поэтому ошибки не возникает, следовательно, программа выполняется успешно, и b вызывает функцию is func(), поэтому выводится “Класс B”.
Что такое чисто виртуальный метод и абстрактный класс?

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

Результатом должен стать код, который представляет из себя алгоритм обхода графа в глубину (DFS — Depth First Search). Пример представлен на изображении.
Для чего нужны алгоритмы all_of, any_of и none_of?

Начиная с C++11 в STL C++ добавляются некоторые новые интересные алгоритмы. Эти алгоритмы работают с массивом и полезны для экономии времени во время кодирования и, следовательно, также полезны в конкурентном программировании.
Каковы спецификаторы доступа в C++?

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

В C++ определены следующие спецификаторы доступа:

public — объявленные таким образом данные и методы класса доступны из любого места программы.

protected — защищенные данные и методы доступны только из самого класса и его подклассов.

private — закрытые элементы доступны только из тела самого класса, где они определены.

Кроме того, есть спецификатор default — когда явный спецификатор доступа не указан. Такие элементы доступны только из текущего класса и друзей.
Что делает алгоритм clamp?

Сравнивает значение с верхней и нижней границей и возвращает ссылку на значение, если оно находится между границами, или ссылку на верхнюю или нижнюю границу, если значение выше или ниже, соответственно.
Что делает алгоритм partial_sort?

Используется для сортировки не всего диапазона, а только его части.

Он переставляет элементы в диапазоне [first, last) таким образом, что элементы до середины сортируются в порядке возрастания, тогда как элементы после середины остаются без какого-либо определенного порядка.
Как можно оптимизировать цикл с первого фото?

В исходном цикле каждый раз происходит вычисление позиции элемента в массиве array. Переписав функцию, мы избавимся от этого вычисления.
Можно ли использовать ссылку при возвращении из функции? Это хорошо или плохо?

Нельзя:
• никогда нельзя возвращать ссылку на локальную переменную, созданную внутри функции, потому что она разрушится сразу после выхода из функции;
• нельзя возвращать ссылку на выделенную память, потому что её нельзя будет очистить.

Можно:
• когда возвращается константная ссылка на член класса;
• когда Вы пишете оператор сдвига вправо, оператор = и оператор индексирования, они должны возвращать ссылку на объект.

Возвращать ссылку - это хорошо, потому что не вызывается лишний копирующий конструктор для возвращаемого значения, но, иногда лучше и правильнее возвращать по значению.
Предполагая, что buf является валидным указателем, в чем проблема в приведенном на картинке коде? Каким был бы альтернативный способ реализации этого, который позволил бы избежать этой проблемы?

Проблема в коде заключается в том, что условие --sz больше либо равно 0 всегда будет истинным, поэтому вы никогда не выйдете из цикла while (поэтому вы, вероятно, в конечном итоге испортите память или вызовете какое-то нарушение памяти или какой-либо другой программный сбой, в зависимости от того, что вы делаете внутри цикла). Причина, по которой условие, что--sz больше либо равно 0, всегда будет истинной, заключается в том, что тип sz равен size_t. size_t на самом деле просто псевдоним одного из основных беззнаковых целочисленных типов. Следовательно, поскольку sz не имеет знака, оно никогда не может быть меньше нуля (поэтому условие никогда не может быть ложным).
Зачем делать explicit-конструктор?

Explicit-конструктор используется для преобразования типов с явным указанием желаемого типа. Это позволяет избежать неявных преобразований и потенциальных ошибок.

Основные причины использовать explicit-конструктора:

— Предотвратить неявные преобразования, которые могут привести к потере данных.
— Избежать вызова конструктора при копировании объекта.
— Принудительно вызывать конструктор только при явном преобразовании типов.
— Улучшить читаемость кода, делая преобразования типов очевидными.
🧑‍💻 Статьи для IT: как объяснять и распространять значимые идеи

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

Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.

Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.

👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.