ТОП-25 популярных вопросов на собеседовании по C++

12
31491
views

В этой статье, опубликованной на proglib.io, приводится список распространенных вопросов, с которыми сталкиваются программисты на собеседовании по C++.

Популярные вопросы собеседований по C++

1. Объясните, что такое OOП?

Самый популярный вопрос на собеседовании по C++. Объектно-ориентированное программирование (ООП) – это тип программирования, в котором программист указывает тип данных для операций, функций и структур данных, используемых в коде, а также создает отношения между объектами.

В ООП структура данных является объектом, в состав которого могут входить как данные, так и функции. Объектно-ориентированное программирование в основном направлено на реализацию реальных сущностей. К ним относятся: абстракция, инкапсуляция, наследование, полиморфизм и т. д.

2. В чем разница между #import и #include?

Распространенный вопрос на собеседовании по C++. Оператор #include используется в C++ для включения исходного файла или импорта заголовков файлов, содержащих объявление функций и прочих конструкций, которые будут совместно использоваться в программе. Оператор #import – это «майкрософт-специфичный» оператор, используемый в бинарных библиотеках, таких как DLLили Lib. Он очень похож на #include, ведь загружает все определения функций и заголовка из файла DLL, а разработчик может использовать заголовки так же, как в случае с #include.

Оператор #include позволяет подключать один и тот же файл несколько раз, а #importгарантирует, что препроцессор включает файл только один раз.

3. Что такое статический элемент?

Static – ключевое слово, используемое для придания элементу уникальных характеристик. Для хранения статических элементов, память выделяется только один раз в течение всего жизненного цикла программы. Такие элементы похожи на глобальные переменные, за исключением области видимости (publicprivate). С их помощью можно ограничить ее использование.

Объявленные методы с тем же именем и параметрами не могут быть перегружены, если любое из них является статическим, плюс статическая функция не может быть объявлена как constvolatileили const volatile.

4. Векторы в C++

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

5. В чем разница между структурой и классом?

В C++ класс является расширением структуры, используемой в ЯП. Класс – это пользовательский тип данных, связывающий данные и зависимые функции в одном блоке. Структура и класс в C++ сильно отличаются, поскольку структура имеет ограниченную функциональность и возможности по сравнению с классом. Структура также является пользовательским типом данных с конкретным шаблоном и может содержать как методы, так и классы. Эти два понятия различаются по назначению: класс используется для абстракции данных и дальнейшего наследования, а структура обычно предназначена для группировки данных.

6. Использование точки в C++

Точка – это чаще всего ссылка на метод или свойство объекта в ООП. Связь между объектом, атрибутами и методами обозначается точкой («.«), установленной между ними. Как точка, так и оператор «->«, используются для ссылки на отдельные члены классов, структуры и объединения. Оператор точка применяется к фактическому объекту, определенному в классе.

7. Чем new() отличается от malloc()?

New() является препроцессором, в то время как malloc() – методом. Пользователю нет необходимости выделять память при использовании «new«, а в malloc() для выделения памяти необходимо использовать функцию sizeof(). «new» инициализирует новую память в 0, в то время как malloc() сохраняет случайное значение в новой выделенной ячейке памяти.

8. Что такое this?

Один из самых популярных вопросов на собеседовании по C++. Ключевое слово this передается всем нестатическим методам как скрытый аргумент и доступен в виде локальной переменной внутри всех нестатических методов. Оператор this является постоянным указателем, который хранит в памяти ссылку на текущий объект. Он недоступен в статических функциях, т. к. они могут вызываться без какого-либо объекта (используя имя класса).

9. В чем разница между массивом и списком?

Массив – это набор однородных элементов, а список – разнородных.
Распределение памяти массива всегда статическое и непрерывное, а в списке все это динамическое и рандомное.

В случае с массивами пользователю не нужно управлять выделением памяти, а при использовании списков придется, из-за ее динамичности.

Собеседование по C++

10. Что такое динамическая и статическая типизация?

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

11. Что подразумевается под делегатом?

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

12. Метод Mutator. Что это?

Функция доступа создает элемент типа protected или private для внешнего использования, но она не дает разрешения на его редактирование или изменение. Изменение protected-элемента данных всегда требует вызова функции-мутатора. Мутатор обеспечивают прямой доступ к защищенным данным, поэтому при создании функции мутатора и аксессора нужно быть очень внимательным.

13. Объясните, что такое одиночное и множественное наследование?

Наследование позволяет определить класс, имеющий определенный набор характеристик (например, методы и переменные экземпляра), а затем создать другие классы, производные от этого класса. Производный класс наследует все функции родительского класса и обычно добавляет некоторые собственные функции.
Множественное наследование является особенностью C++, где один класс может наследовать объекты и методы нескольких классов. Конструкторы наследуемых классов вызываются в том же порядке, в котором наследуются базовые классы.

14. Может ли встроенная функция быть рекурсивной?

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

15. Объясните, что такое инкапсуляция?

Среди вопросов на собеседовании по C++ на этом»сыпятся» почти все новички. Инкапсуляция – это механизм объединения используемых данных и функций для сокрытия деталей реализации от пользователя. При этом пользователь может выполнять только ограниченный набор операций со скрытыми членами класса, используя внутренние методы. Эта ООП концепция часто применяется для сокрытия внутреннего представления или состояния объекта от «внешнего мира».

16. Что такое абстракция? Чем она отличается от инкапсуляции?

Абстракция – это механизм предоставления только интерфейсов, сокрытия сведений о реализации и “показ” необходимых деталей функционала. Инкапсуляцию можно понимать как сокрытие свойств и методов от внешнего мира. Класс является лучшим примером инкапсуляции в C++.

17. Что такое встроенные функции? Каков синтаксис для определения?

Встроенная функция – это функция, объявляемая с ключевым словом inline. Всякий раз, когда вызывается встроенная функция, ее полный код подставляется в место вызова. Компилятор выполняет эту подстановку во время компиляции. Встроенная функция может повысить эффективность кода.

Синтаксис для определения функции:

[code]inline void hello()
{
// function code
}[/code]

18. В чем разница между указателем и ссылкой в C++?

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

19. Почему C++ является языком программирования среднего уровня?

Почти весь код на С будет успешно работать на C++, но это не дает повода рассматривать его как надмножество C. С++ можно назвать языком среднего уровня, т. к. он обладает чертами ЯП низкого и высокого уровней одновременно.

20. Объясните, что такое полиморфизм?

Еще один из важных вопросов на собеседовании по C++. Полиморфизм – это способность функции работать с разными типами данных. Обычно в ЯП речь идет о двух типах полиморфизма:

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

21. Что такое определение класса?

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

Вопросы на собеседовании по C++

22. Что означают ключевые слова volatile и mutable?

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

mutable может использоваться для переменных класса. Такие переменные могут изменяться изнутри функций класса.

23. Что такое виртуальная функция?

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

Ключевое слово virtual используется для создания виртуального метода.

24. Что подразумевается под перегрузкой функций и операторов?

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

Перегруженные функции – это функции не только с одинаковыми именами, но и с разными типами и количеством передаваемых параметров. Приведем несколько классов, в которых можно перегружать, например, арифметические операторы: Complex NumberFractional NumberBig Integer.

25. Что такое переопределение функции?

Функция становится переопределенной, если производный класс унаследует ее от базового и определит ее у себя. Если функция существует в двух классах (базовый и производный), то при вызове будет выполнена переопределенная функция, а функция базового класса будет проигнорирована.


12 КОММЕНТАРИИ

  1. Статья «как не пройти собеседование на с++».
    Ошибки просто ужасны. Неужели в редакции нет ни одного плюсовика?
    Как пример — номер 7. new -ПРЕПРОЦЕССОР. ПРЕПРОЦЕССОР КАРЛ!

  2. Ужасная статья, ощущение, что её писал незнакомый с плюсами человек. Просто миллион ошибок…

  3. Ужас, если вопросы еще куда не шло, то ответы, будто их сочинявшй не то чтобы на C++ не писал, так еще и местами плохо прочитал нагугленное. А ведь кто-то это может прочитать и так оветить на собеседовании. 🙁

  4. Жесть. Если нет возможности отредактировать (сами вопросы имеет право на существование), текст лучше убрать, потому что часть ответов просто неверна.

  5. Public и private — не области видимости, а модификаторы доступа (третий вопрос), дальше даже читать не стал

  6. Каждый ответ — чушь собачья. Но про отличия class и struct вы меня вообще заагрили.
    Запомните, они отличаются только модификаторами доступа по умолчанию (у class это private, у struct — public), вам вообще ничего не мешает переписать любой код с виртуальными методами, наследованием и т. д. с class на struct, или наоборот, главное private где надо расставить. Зачем вы плодите такую безграмотность?!

    • Константин, а абстрактные функции вы сможете использовать в структуре? Конечно же нет, не сможете… Это и хотел донести автор, а про модификаторы доступа, вы верно подметили…

      • Эй, Аноним — если что, то это С++, а не С#. И правильнее писать «абстрактные методы». И также они могут быть и в структурах. 😉

  7. Может ли встроенная функция быть рекурсивной?
    может. курим оптимизацию хвостовой рекурсии

  8. стать просто дерьмо. надеюсь если люди, которые сразу читают комментарии

ОСТАВЬТЕ ОТВЕТ

Please enter your comment!
Please enter your name here