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

Чтобы избежать возможной утечки ресурсов или другого неконтролируемого поведения объекта, в логику работы которого включен вызов деструктора.
class My < public: virtual ~My() < std::cout >; class Derived : public My < public: virtual ~Derived() < // Здесь могла бы быть очистка ресурсов std::cout >; My *obj = new Derived(); delete obj;
Output:
Hello from ~Derived() Hello from ~My()
Без ключевого слова virtual у родительского класса My деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только ~My().
Что стоит помнить при использовании исключений в конструкторе объекта?
Если исключение не обработано, то c логической точки зрения разрушается объект, который еще не создан, а с технической, так как он еще не создан, то и деструктор этого объекта не будет вызван.
Например:
class Base < private: HANDLE m_hFile; public: Base() < std::cout virtual ~Base() < std::cout >; try < Base b; >catch(const std::exception &e)
Output:
Hello from Base() Exception message: Something failed
Здесь могут спросить: «Как бы вы решили эту проблему при подобной ситуации». Правильный ответ: «Воспользовался бы умными указателями».
Пример умного указателя:
class Base < private: class CHandle < public: ~CHandle() < ::CloseHandle(m_handle); >private: HANDLE m_handle; public: // Для полноценного smart pointer'а перегрузки одной операции // не достаточно, но для нашего примера и понимания вполне хватит void operator = (const HANDLE &handle) < m_handle = handle; >>; CHandle m_hFile; public: Base() < std::cout virtual ~Base() < std::cout .
Теперь и без вызова деструктора Base хэндл будет закрыт, т.к. при уничтожении класса Base будет уничтожен объект m_hFile класса CHandle, в деструкторе которого и будет закрыт хэндл.
Изобретать велосипед, конечно, не надо, все уже написано до нас, например в boost, Loki, ATL и т.п.
Для каких целей применяется ключевое слово const?
- Позволяет задать константность объекта
- Позволяет задать константность указателя
- Позволяет указать, что данный метод не модифицирует члены класса, т.е. сохраняет состояние объекта
Учтите что константный метод может изменять члены класса, если они объявлены как mutable
Можете ли вы написать пример какого-нибудь алгоритма сортировки?
Первое что приходит всем на ум это сортировка пузырьком.
Рассмотрим пузырковую сортировку без временных переменных
template void bubble_sort( T &a ) < for( T::size_type i = 0; a.size() && i < a.size() - 1; ++i ) < for( T::size_type j = i; j + 1 >0; --j ) < if( a[j] >a[j+1] ) std::swap( a[j], a[j+1] ); > > > std::vector v; v.push_back( 7 ); v.push_back( 1000 ); v.push_back( 134 ); v.push_back( 23 ); v.push_back( 1 ); bubble_sort( v );
Напишите код для реверса строки?
template void invert_string( T &a ) < T::size_type length = a.size(); for( T::size_type i = 0; i < (length/2); ++i ) < std::swap( a[i], a[length - i - 1] ); >> std::string str = "abcdefg"; invert_string(str);
Как защитить объект от копирования?
Сделать private конструктор копирования и оператор =.
class NonCopyable < public: NonCopyable()<>private: NonCopyable(NonCopyable&)<> private: void operator=(const NonCopyable&)<> >; NonCopyable a; NonCopyable b = a; // error C2248: 'NonCopyable::NonCopyable' : cannot access private member a = b; // error C2248: 'NonCopyable::operator =' : cannot access private member
В чем разница между struct и class?
Практически ни в чем. В struct модификаторы доступа по умолчанию public, в class private. Также отличается и наследование по умолчанию, у struct — public, у class — private.
Сколько в памяти занимает произвольная структура?
sizeof всех членов + остаток для выравнивания (по умолчанию выравнивание 4 байта) + sizeof указателя на vtable (если есть виртуальные функции) + указатели на классы предков, от которых было сделано виртуальное наследование (размер указателя * количество классов)
Как сгенерировать pure virtual function call исключение?
Нужно вызвать чисто виртуальный метод в конструкторе родительского класса т.е. до создания дочернего, в котором этот метод реализован. Т.к. современный компилятор не даст это сделать напрямую, то нужно будет использовать промежуточный метод.
class Base < public: Base() < base_func(); >void base_func() < func(); // pure virtual function call exception >virtual void func() = 0; >; class Derived : public Base < public: virtual void func() < >>;
В чем отличие vector от deque?
Здесь вспоминают о наличии у deque методов push_front и pop_front. Но основное отличие в организации памяти, у vector она как у обычного Си-массива, т.е. последовательный и непрерывный набор байт, а у deque это фрагменты с разрывами. За счет этого отличия vector всегда можно привести к обычному массиву или скопировать целиком участок памяти, но зато у deque операции вставки/удаления в начало быстрее (O(1) против O(n)), ввиду того, что не нужно перемещать
В чем отличие malloc от new?
malloc — выделение блока памяти в стиле Си, опасное с точки зрения приведения типов (non-typesafe), т.к. возвращает void * и требует обязательного приведения. new — выделение блока памяти и последующий вызов конструктора, безопасное с точки зрения приведения типов (typesafe), т.к. тип возвращаемого значения определен заранее.
В чем различия между dynamic_cast и reinterpret_cast?
Динамическое приведение - это безопасное приведение по иерархии наследования, в том числе и для виртуального наследования. Проводит преобразование типа, предварительно убедившись (с помощью RTTI), что объект expression_from в действительности является объектом типа type_to. Если нет: для указателей возвращает NULL.
При reinterpret_cast результат не гарантирован, проверки не осуществляются. Ограничения на expression_from: порядковый тип (логический, символьный, целый, перечисляемый), указатель, ссылка. Ограничения на type_to: для порядкового типа или указателя — порядковый тип или указатель. Для ссылки — ссылка.
Для чего нужен аллокатор и как создать свой собственный аллокатор?
Аллокатор это шаблонный класс, который отвечает за выделение памяти и создание объектов. По умолчанию все контейнера используют std::allocator.
В языке c++ имеется так же возможность написать свой аллокатор. У своего алокатора должно быть такое объявление:
template class my_allocator < typedef size_t size_type; typedef ptrdiff_t difference_type; typedef T* pointer; typedef const T* const_pointer; typedef T& reference; typedef const T& const_reference; typedef T value_type; pointer allocate(size_type st, const void* hint = 0); void deallocate (pointer p, size_type st); void construct (pointer p, const_reference val); void destroy (pointer p); template struct rebind < typedef allocatorother; >; >;
В чём суть множественного наследования? Какие проблемы могут возникнуть при его использовании? Как их преодолеть?
Множественное наследование – мощный способ связи классов в с++. С помощью множественного наследования класс может иметь сразу несколько базовых классов, объединяя в себе их свойства. Однако данный метод порождает определенные неудобства, из-за которых множественно наследование отсутствует в таком языке, как Java, к примеру, уберегая программиста от возможных проблем, и вынуждая его строить механизм множественного наследования без порождения выше упомянутых проблем.
Проблемы, собственно говоря, возникают, когда имеет место такая ситуация:
Пусть класс A – базовый, далее классы B и С наследуют A, к классу D применено множественное наследование - для него базовыми являются одновременно B и C. Программа видит эту структуры таким образом:
A(1) A(2)
| |
B C
\ /
D
Теперь, вызывая из D метод, расположенный в A программа сталкивается с неоднозначностью: а из «какого» A вызывать? A(1) или A(2)?
Избежать данной проблемы поможет использование ключевого слова virtual, которое превращает класс A в виртуальный класс, так сказать «класс – шаблон». Теперь никакой неоднозначности нет, и ситуация выглядит вот так:
A
/ \
B C
\ /
D
Какая разница между указателями:
int* i=new int[0]; int* j=(int*) malloc(0);
Ответ:
int* i=new int[0];
возвращает ненулевой указатель, а
int* j=(int*) malloc(0);
возвращает нулевой указатель.
int* i=new int[0];
выделит память в GlobalHeap, а
int* j=(int*) malloc(0);
выделит в LocalHeap.
Отсюда в оператора new преимущества в памяти.
В чем основное различие между деструктором и оператором delete?
Оператор delete освобождает область памяти зарезервированную ранее с помощью оператора new. При этом для объектов автоматически будет вызван деструктор. Деструктор содержит код, который необходимо выполнить до освобождения памяти, например, освобождение системных ресурсов и т.д. Вызов деструктора вручную не приводит к освобождению памяти, занимаемой объектом.
Чем отличается vector от deque?
Отличие в организации памяти, у vector она как у обычного Си-массива - последовательный и непрерывный набор байт, а у deque это фрагменты с разрывами. За счет этого отличия vector всегда можно привести к обычному массиву или скопировать целиком участок памяти, но зато у deque операции вставки/удаления в начало быстрее (O(1) против O(n)), ввиду того, что не нужно перемещать остальные значения. А также наличие у deque методов push_front и pop_front.
Что можно сказать о delete this?
Это выражение считается выражением плохого тона и нужно стараться избегать его использования, так как оно ведет к ошибкам.
Данная конструкция имеет две ловушки.
Во-первых, если оно выполняется в методе extern, static или automatic объекта, программа скорее всего завершится досрочно вскоре после выполнения оператора delete. Не существует переносимого способа сообщить, что объект создан на куче, таким образом класс не может проверить корректно ли объект создался.
Во-вторых, при таком самоуничтожении, программа может и не узнать об этом. Для нее объект по-прежнему продолжает существовать, несмотря на то, что это не так. Любое обращение к this или к любым данным объекта приведет к катастрофическим последствиям. При этом методы, которые не содержат обращения к полям-данным объекта, выполняются нормально.
В чем разница между массивом и списком?
Массив – это набор однородных элементов, а список – разнородных.
Распределение памяти массива всегда статическое и непрерывное, а в списке все это динамическое и рандомное.
В случае с массивами пользователю не нужно управлять выделением памяти, а при использовании списков придется, из-за ее динамичности.
46 вопросов на собеседовании по C++ от ведущих IT компаний
Если вы готовитесь к собеседованию в команде разработчиков программного обеспечения, которая регулярно использует C ++, лучшее, что вы можете сделать, - это попрактиковаться в вопросах, которые вы, скорее всего, увидите.
Когда вы работаете над этими проблемами, убедитесь, что вы имитируете среду собеседования: сядьте в тихом месте, говорите вслух, работая над вопросом, и рассчитайте время.
Просмотрите этот список из 46 вопросов для собеседований по C ++ от реальных технологических компаний и ознакомьтесь с нашими советами, чтобы вы могли дать наилучшее интервью.
- Вопрос Accenture - Различия между классом и структурой в C ++.
- Вопрос Infosys - что делает функция Friend в C ++?
- Вопрос ACI Worldwide - в чем разница между вектором и массивом?
- Вопрос Accenture - каковы спецификаторы доступа в C ++?
- Вопрос IBM - что такое функция main () в C ++? Можем ли мы запустить программу без основного метода?
- Вопрос 23andMe - Что такое наследование в объектно-ориентированном программировании?
- Вопрос Intel. У вас есть поток бесконечных запросов (например, поисковые запросы Google в реальном времени, которые вводят люди). Опишите, как вы могли бы найти хорошую оценку в 1000 выборок из этого бесконечного набора данных, а затем написать для него код.
- Infosys вопрос - Вам дается список номеров. Когда вы дойдете до конца списка, вы вернетесь в начало списка (круговой список). Напишите наиболее эффективный алгоритм поиска минимального числа в этом списке. Найдите любой заданный # в списке. Числа в списке всегда увеличиваются, но вы не знаете, где начинается круговой список, например: 38, 40, 55, 89, 6, 13, 20, 23, 36.
- Вопрос Google - если у вас есть 1 миллион целых чисел, как бы вы их эффективно отсортировали? (измените конкретный алгоритм сортировки, чтобы решить эту проблему)
- Вопрос Adobe - напишите код для переворота строки.
- Как C ++ работает с конструкторами и деконструкторами класса и его дочернего класса?
- Вопрос Adobe: создайте механизм быстрого кэширования хранилища, который, учитывая ограничение на объем кэш-памяти, будет гарантировать, что только наименее использованные элементы будут отбрасываться при достижении кэш-памяти при вставке нового элемента. Он поддерживает 2 функции: String get (T t) и void put (String k, T t).
Начнем с разъяснений
Получив вопрос, подумайте и задайте уточняющие вопросы 15–30 секунд, прежде чем сразу перейти к проблеме. Хотя существует ограничение по времени, вы не должны слишком торопиться. Вот некоторые примеры этих вопросов: «Разрешено ли повторение?» или «Вы хотите вернуть перестановки или комбинации?»
Покажи то, что знаешь
Во время работы заранее предоставляйте информацию о том, что вы делаете, чтобы интервьюер увидел, что вы имеете твердое представление о предмете. Хотя кодирование может занять некоторое время, выгода компенсирует это.
Сделайте контекстные утверждения
Контекстные утверждения - еще один способ показать положительный сигнал. Если вы аргументируете принимаемые решения, вы можете изменить восприятие вашей работы интервьюером. Это может помочь вам, если вы ошиблись, потому что это дает интервьюеру понимание того, о чем вы думали.
Задайте совместные вопросы, чтобы получить помощь
Пока вы работаете над вопросом собеседования, вы можете достичь точки, когда вам понадобится помощь. Вместо того, чтобы просить «подсказки», что не нравится некоторым интервьюерам, попробуйте дать предысторию вашей проблемы и спросить интервьюера, могут ли они помочь вам вести вас по правильному пути. Например, вы можете сказать: «Мои предположения - это X и Y, я подумываю сделать Z. Но я борюсь с решением [проблемы]». Вы также можете спросить:
- Мне было интересно, есть ли у вас какие-нибудь мысли.
- Как вы думаете, я иду в правильном направлении?
- Как вы думаете, мои предположения неверны?
HR Блог для IT рекрутера в Телеграм
Хочешь всегда получать новые статьи, бесплатные материалы и полезные HR лайфхаки! Подписывайся на нас в Telegram! С нами подбор ит персонала становится проще 😉
Какие вопросы задают на собеседование программисту C(Си), не С++?
Что-то давненько я не был на собеседования, а тут меня сами нашли. Решил поискать в интернете и тут, везде C++, а C нету. Может кто подскажет-расскажет? Что спрашивают сейчас?
- Вопрос задан более трёх лет назад
- 13211 просмотров
Комментировать
Решения вопроса 1

Ответ написан более трёх лет назад
Нравится 5 2 комментария

Дмитрий Фалько @lSDriim Автор вопроса
В первой ссылке есть вопросы, ответы на которые неверны или не точны.

Дмитрий Фалько: вы просили только вопросы
Ответы на вопрос 3

Дмитрий Фалько @lSDriim Автор вопроса
Embedded программист
Пока что нашел 2 уровня на Quizful. Неужели больше ничего?
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Senior software engineer (C++/Qt/boost)
Это будет сильно зависеть от предметной области и вакансии. Благо там по самому языку C особо и спрашивать нечего -- K&R, ну + мб пару хаков. Cети могут спросить, что-нибудь по осям, про какие-нибудь железяки хитрые, что-то из криптгографии. Как я уже и говорил, будет от вакансии зависеть, так сложно угадать.
ООП и паттерны почти точно не спросят.
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
У меня спрашивали, чем
#include
отличается от
#include "some.h"
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Программирование
- +2 ещё
Хештаблицы, можно ли мешать open addressing и chaining?
- 2 подписчика
- 3 часа назад
- 48 просмотров
Вопросы для интервью с разработчиками C и C ++
Разработчики C и C ++ не получают такого же шума, как разработчики других языков. Они не так распространены, как разработчики JavaScript. Они не так хорошо связаны с такими актуальными темами, как наука о данных, как разработчики Python. Они не используют такие перспективные технологии, как разработчики Kotlin.
Но в отличие от технологий, о которых заговорили все заголовки, C и C ++ продолжают оставаться рабочими лошадками для многих важных систем, а также для таких областей, как встроенные технологии и игры. В результате по-прежнему на них существует большой спрос. Возникает вопрос: как проверить навыки программистов C и C ++?
И C, и C ++ существуют уже давно, так что о них есть чему поучиться. Для этих стеков технологий созданы разные версии, технологии и ресурсы. Вам нужно использовать определенные вопросы для собеседований на C и C ++, поскольку те, которые вы используете для таких языков, как Java, просто не помогут. Есть концепции, которые вы просто не увидите вне C в C ++. Кроме того, вам понадобится правильный технический бекграунд знаний, чтобы увидеть, есть ли у кого-то навыки C или C ++.
1. Что такое C и что такое C ++?
Первое, что вам нужно понять, это то, что C и C ++ - это не одно и то же. Как вы понимаете, C существует немного дольше, чем C ++. Представленный в 1972 году, к концу того десятилетия C стал де-факто стандартом. Первая версия C ++ появилась только в 1984 году. Но, опять же, потребовалось всего 10 лет, чтобы закрепиться. К началу 90-х годов C ++ приобрел большую популярность.
1.1. В чем разница между C и C ++?
Во-первых, C - это процедурный язык. С другой стороны, C ++ - это язык с множеством парадигм. Он превосходит процедурное и объектно-ориентированное программирование. Кроме того, новые функции делают его практичным выбором для функционального программирования. В большинстве реальных случаев программы на C ++ в той или иной степени будут использовать все доступные парадигмы программирования. Фактически, вы часто будете видеть смешанные вместе все три парадигмы.
Парадигмы программирования - не единственное различие между ними. C довольно близок к машинному уровню и иногда упоминается как «портативный ассемблер». C ++, с другой стороны, ближе к языкам более высокого уровня, таким как Java, C # и D (хотя по-прежнему сохраняет некоторые низкоуровневые функции C).
1.2. Чем похожи C и C ++?
Помимо этих различий, безусловно, есть некоторые сходства. Синтаксис, используемый обоими этими языками, часто называют «синтаксисом семейства C». Поскольку C был настолько популярен, вы фактически обнаружите, что грамматика и синтаксис C являются основой для ряда языков программирования, таких как Java, C #, C ++, D, Objective-C, JavaScript и многих других.
2. Для чего используются C и C ++?
2.1. Для чего используется C?
Поскольку они настолько близки к машинному уровню, C и C ++ в основном используются для приложений, где скорость обработки и ручная настройка более важны, чем время разработки. К ним относятся низкоуровневое программирование (BIOS), встроенное программирование (устройства), системное программирование (операционные системы) и ориентированное на производительность программирование (например, игровые движки, GPU / научные вычисления, криптография).
Реальное преимущество C и C ++ заключается в том, что он дает программисту возможность сказать, что происходит с программой на самом низком уровне, ближайшем к машинному. С одной стороны, это дает C и C ++ невероятную производительность. Обратной стороной этого является то, что существует гораздо меньшая погрешность для правильного написания кода, поскольку в них отсутствует функция управления памятью языков более высокого уровня. Практически это означает, что для написания рабочего кода на C и C ++ может потребоваться гораздо больше времени, чем на языке программирования более высокого уровня, таком как Java или Python.
Поскольку C так близок к машинному уровню, это, по сути, лингва-франка мира программирования. Большинство других языков программирования построены с использованием C, и большая часть программного обеспечения предоставляет свои функции на C. Почти все другие языки могут вызывать функции C.
На базовом уровне Си довольно легко выучить. Его синтаксис и грамматика довольно просты для изучения основ, но их сложно освоить. В отличие от других языков, в C отсутствуют инструменты, которые снимают нагрузку с загруженной работы, которой разработчик обычно хотел бы избежать.
2.2. Для чего используется C++?
C++ был частично разработан для решения некоторых низкоуровневых проблем C при сохранении стиля программирования C. К сожалению, это означает, что кривая обучения C++ невероятно крута, и это гораздо более удобный язык для экспертов. Это может еще больше затруднить использование чужой кодовой базы. К счастью, новые версии C++ позволяют легко и безопасно создать подмножество стороннего кода. Тем не менее, команда программистов должна избегать использования небезопасных конструкций и обеспечивать соблюдение правил.
C ++ раньше был расширением C, но на самом деле это не так с 1998 года. Теперь это в значительной степени собственный язык. Большая часть кода C будет компилироваться на C ++ без его изменения, но ни один из них не является строгим подмножеством другого. Тем не менее, разрыв между ними продолжает увеличиваться по мере выпуска новых стандартов.
2.3. В чем разница между C и C ++?
C ++ позволяет компилировать большинство конструкций и кода C как код C ++, а также позволяет использовать больше инструментов программирования, таких как шаблоны, RAII (Resource Acquisition Is Initialization), классы, лямбда-выражения, более крупную и более мощную стандартную библиотеку и более надежную систему типов. .
В то же время в C есть некоторые инструменты, которых нет в C ++. К ним относятся назначенные инициализаторы и массивы переменной длины (VLA). Общее правило заключается в том , что если среда C ++ присутствует, то вы можете быть на сто процентов уверены , что среда C присутствует. Обратное не обязательно.
3. Что ИТ рекрутер должен знать о C и C ++?
C давно не менялся. Последние две ревизии, C11 и C18, обе довольно незначительны и не предлагают больших изменений. Будущий C21 тоже не выглядит новаторским. C++, с другой стороны, начинает прогрессировать после того, как за последнее десятилетие мало что сделал. Теперь каждые три года с момента выхода C ++ 11 выпускается ревизия, причем ожидается, что C ++ 20 выйдет вовремя.
Почти все доступные библиотеки предоставляют C API или привязку, даже если они написаны на другом языке. C ++ можно использовать для всех этих библиотек. Есть также некоторые библиотеки только для C ++, такие как Boost, Qt и POCO.
3.1. С какими инструментами и методами должен быть знаком разработчик на C или C ++?
Вероятно, наиболее важным для разработчика C является понимание арифметики указателей и того, что составляет неопределенное поведение. Кроме того, разработчик на C должен уметь использовать инструменты отладки, такие как Address / Memory / UndefinedBehavior Sanitizer, Valgrind, отладчики (например, GDB) и инструменты статического анализа кода.
Разработчик C ++ должен быть в состоянии понимать все инструменты C, а также библиотеки Boost и Qt, достаточно хорошо, чтобы иметь возможность их использовать.
Кроме того, если посмотреть на опыт разработчиков, коммерческие проекты и проекты с открытым исходным кодом больше всего говорят о том, на что они способны.
4. Оценка разработчика C или программиста C++ по их резюме.
Резюме - это первое место, где вы можете найти подсказки о том, на что способен ваш кандидат. Для нетехнического рекрутера это часто может быть трудным местом для начала, поскольку информация часто носит технический характер. Чтобы помочь вам, мы составили список вещей, которые нужно искать в резюме разработчика C и C ++.
4.1. Глоссарий C и C ++ для технических рекрутеров
C библиотеки:
Стандартная библиотека C: Библиотека, описанная в стандартном документе C, поставляется с каждым компилятором
Другие, менее широко используемые, но все же популярные библиотеки:
GTK: Библиотека для создания графических пользовательских интерфейсов
Cairo: Библиотека 2d графики
ALSA: Библиотека для взаимодействия с Advanced Linux Sound Architecture
BLAS: Основные подпрограммы линейной алгебры. Эта библиотека используется для эффективных векторных и матричных операций
GMP: GNU Multi Precision. Библиотека, обеспечивающая арифметические операции над числами произвольной точности
cURL: Библиотека многопротокольной передачи файлов. Чаще всего используется для HTTP-коммуникаций
OpenSSL: Коммерческая и очень популярная библиотека, используемая для поддержки криптографии.
Библиотеки C ++
Стандартная библиотека C ++: Библиотека, описанная в стандартном документе C ++, поставляется с каждым компилятором.
Boost: Одна из самых популярных библиотек для C ++, набор из нескольких десятков отключенных библиотек, которые можно свободно использовать в программах на C ++.
Qt: Фреймворк GUI для C ++
STL: Спорный акроним, который обычно означает стандартную библиотеку C ++, но понимается как стандартная библиотека шаблонов , как если бы части, не являющиеся шаблонами, не были ее частью.
Eigen: Библиотека шаблонов C ++ для линейной алгебры (матрицы, векторы, числовые решатели и связанные алгоритмы)
GSL: Рекомендации Поддержка реализации библиотеки, рекомендованная Бьярном Страуструпом, Хербом Саттером и компанией в C ++ Core Guidelines
Loki: шаблоны проектирования
Folly: Набор компонентов C ++ 11, расширяющих стандартную библиотеку. Создан с учетом эффективности и практичности. Разработано Facebook
Abseil: Коллекция библиотек C ++, расширяющая стандартную библиотеку. Создано Google
POCO: Набор библиотек, поддерживающих HTTP, сеть, шифрование и поддержку zip-файлов.
WxWidgets: Библиотека, позволяющая создавать независимые от системы приложения с графическим интерфейсом.
OpenCV: Библиотека компьютерного зрения, разработанная для повышения вычислительной эффективности с акцентом на приложениях реального времени.
OpenMP: Меньше библиотеки и больше спецификации для компиляторов, как расширить C ++, чтобы обеспечить простой и хорошо продуманный параллелизм
IntelTBB: Библиотека шаблонов для параллелизма задач. Разработано Intel
Компилятор: Самый популярный инструмент, используемый для создания исполняемого файла ( приложения ) из исходного кода C / C ++:
- GCC - Сборник компиляторов GNU
- MinGW GCC - версия GCC для Windows
- Clang - компилятор проекта LLVM
- MSVC (также называется, несколько неправильно, MSVS или Visual Studio) - компилятор Microsoft
- ICC - компилятор Intel
Статический анализ: Анализ исходного кода на наличие ошибок. Существует коммерческое программное обеспечение, которое может таким образом находить некоторые классы ошибок.
- CppCheck
- Clang
- Klocwork Static Code Analysis
- PC-Lint
- Coverity
- PVS-Studio
- C89
- C95
- C99
- C11
- C18
- C21 (еще не опубликовано),
- ANSI C
- Определяет ли кандидат версию используемого языка
- Работал над типичным проектом на C ++
- Участвует в крупных проектах, отвечающих уникальным и строгим требованиям.
5.1. Вопросы об опыте кандидата
В1: (C / C ++) Какие ограничения были у ваших предыдущих проектов?
Кандидат должен иметь возможность поделиться своим опытом работы в данной отрасли. Например, во встроенном программировании сложно использовать динамическую память, а для игр очень важно обеспечить завершение всех вычислений к моменту рендеринга одного кадра.
В2: (C / C ++) Для каких систем вы программировали?
В некотором смысле программирование для Embedded / Desktop и Linux / Windows / OSX сильно отличается.
В3: (C / C ++) Придерживались ли вы при программировании каких-либо конкретных стандартов?
Кандидат может сказать вам, есть ли у него опыт работы с MISRA и т. Д.
5.2. Вопросы о знаниях и мнениях кандидата
В1: (C ++) Каковы основные различия между C ++ и C?
Этот вопрос позволит кандидату продемонстрировать свое понимание языков, а также то, относятся ли они к C ++ как к небольшому дополнению к языку C или как к отдельному языку с различными шаблонами использования.
В2: (C) Что такое арифметика указателей?
Это в основном для C. Этот вопрос позволит кандидату выразить свое понимание фундаментального способа, которым C работает с памятью.
В3: (C ++) Что такое арифметика указателей?
Этот вопрос даст кандидату возможность выразить свое понимание фундаментального способа, которым C работает с памятью. Осторожно: для C ++ этот вопрос подразумевает использование небезопасных и устаревших шаблонов в вашей кодовой базе.
В4: (C ++, начальный уровень) В чем разница между классом и объектом?
Чтобы определить, понимает ли кандидат основы C ++.
В5: (C ++) Что такое лямбда выражение?
Чтобы определить, знает ли кандидат об улучшениях, достигнутых C ++ после C ++ 03 (лямбда-выражения были введены в C ++ 11), и понимает ли их.
В6: (C / C ++) Что такое блокировки, какие проблемы они решают и каковы потенциальные проблемы с ними?
Это покажет понимание кандидатом блокировок, условий гонки, взаимоблокировок и живых блокировок.
В7: (C / C ++, эксперт) Что такое volatile и как оно соотносится с вопросом о блокировках и синхронизации?
Кандидат должен уметь сказать, что энергозависимость должна использоваться только для доступа к оборудованию, а не для синхронизации.
В8: (C ++) Как создать динамический массив?
Это покажет, будет ли кандидат использовать хороший подход, такой как std :: vector , или устаревший и небезопасный новый .
В9: (C ++) Что такое RAII? Есть ли это на других языках?
Это покажет, знает ли кандидат эту фундаментальную идиому C ++ и понимает ли он, что это означает. Бонусные баллы за описание аналогичных дополнительных функций на других языках, например with () в Python или использование в C #.
В10: (C ++) Можно ли выбросить из деструктора?
Кандидат сможет уточнить детали здесь. Суть в том, что вы можете, но это плохая практика, и она отключена по умолчанию, начиная с C ++ 11, поскольку деструкторы в этом случае неявно не срабатывают .
В11: (C ++) Можете ли вы унаследовать конструктор?
Кандидат может ответить, что это возможно, начиная с C ++ 11, незначительное изменение способа его работы в C ++ 14 и последствия этого изменения.
В12: (C ++) У вас есть виртуальный конструктор?
Краткий ответ - нет, но кандидат может продемонстрировать свое быстрое мышление, упомянув фабричные и прототипные шаблоны.
В13: (C ++) Что такое интерфейс?
Это вопрос с подвохом, потому что C ++ не имеет интерфейсов. Однако в нем есть абстрактные классы, и кандидат должен говорить о них.
В14: (C ++, эксперт) Можно ли реализовать чисто виртуальную функцию?
Да, но удобство использования ограничено.
В15: (C ++, эксперт) Можно ли использовать функцию виртуального шаблона и почему?
Кандидат сможет продемонстрировать свое понимание разницы между временем компиляции и времени выполнения, а также детали реализации, такие как vtables .
В16: (C ++, эксперт) Как бы вы реализовали std :: is_same ?
Программист сможет продемонстрировать свои знания в области метапрограммирования, реализовав этот тривиальный пример.
В17: (C / C ++) Какое изменение (или ряд изменений) в C nn / C ++ nn вам больше всего нравится ?
Чтобы показать, успевает ли кандидат за изменениями в языке (ах), и знает ли он о немного разных идиомах кодирования в разных версиях языка.
В18: (C ++) В чем разница между C ++ 98 и C ++ 11?
C ++ 11 стал серьезным сдвигом в языке C ++, его парадигмах и шаблонах. Кандидат сможет продемонстрировать свои знания об этом важном изменении.
В19: (C / C ++) Как бы вы обнаружили и исправили ошибку повреждения памяти?
Показать мыслительный процесс, знания и инструменты, полезные в таких усилиях.
В20: (C / C ++) У вас есть опыт использования пользовательских распределителей?
Кандидат сможет поделиться своим опытом с пользовательскими распределителями.
В21: (C / C ++) В вашем резюме есть фреймворк / библиотека X, опишите свой опыт работы с ней. Было ли использование хорошим выбором? Есть ли альтернатива, которую вы предпочли или предпочли бы сейчас?
Это открытый вопрос, позволяющий рекрутеру узнать, имеет ли кандидат широкое представление о полях, знает ли альтернативы и понимает ли компромиссы, принимаемые при выборе того или иного решения.
В22: (C / C ++) Какая система сборки вам больше нравится и почему? Как это по сравнению с конкурентами?
Почему вам следует задать вопрос 22: это покажет знания кандидата о системах сборки.
5.3. Поведенческие вопросы, которые следует задать, чтобы понять, как кандидат действовал в прошлом.
В1: Какова ваша самая большая история успеха в программировании? Почему так случилось? Как это повторить?
Этот вопрос позволит кандидату рассказать историю успеха и покажет рекрутеру, заинтересован ли кандидат в решении проблемы или в получении похвалы.
В2: Какая была ваша самая большая ошибка в программировании? Почему так случилось? Как избежать повторения этого в будущем?
Этот вопрос позволит кандидату рассказать потенциально тревожную историю и покажет рекрутеру, открыто ли кандидат в этом вопросе. Это дополнительно покажет, заинтересованы ли они в решении проблемы или в перекладывании вины.
В3 (для более старших вам нравится -уровни заявителей) О, если бы наставник младшего разработчика? Почему? Как бы вы это сделали? Есть ли у вас опыт наставничества других людей?
Это позволит рекрутеру оценить интерес кандидата и необходимые мягкие навыки, необходимые для обмена знаниями.
6. Техническая проверка навыков разработчиков C или C ++ с помощью онлайн-теста кодирования.
С разработчиками C и C ++ вы должны быть абсолютно уверены в том, что очень важно, чтобы они обладали безупречными навыками программирования. C не допускает никакой погрешности, а C ++ не допускает гораздо большего. Конечно, экран резюме и экран телефона могут помочь вам отсеять некоторых из ваших кандидатов. Тем не менее, последнее, что вы хотите сделать, - это пригласить кандидата на техническое собеседование только для того, чтобы обнаружить, что у него никогда не было необходимых вам навыков программирования.
- Они отражают реальную проделанную работу
- Они не отнимают у кандидатов слишком много времени, максимум 1-2 часа.
- Их можно отправлять автоматически и брать с собой куда угодно
- Они выходят за рамки проверки того, работает ли решение, а также проверяют качество кода и насколько хорошо он работает в крайних случаях.
- Они максимально приближены к естественной среде программирования и позволяют кандидату получать доступ к тем ресурсам, с которыми он обычно работает.
- Они позволяют кандидату использовать все библиотеки, фреймворки и другие инструменты, которые он обычно использовал бы.
- Они находятся на должном уровне, соответствующем способностям кандидата