Что спрашивают на собеседовании c
Перейти к содержимому

Что спрашивают на собеседовании c

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

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

Самые популярные и задаваемые вопросы на собеседованиях .Net разработчика.

Общие вопросы

В чем разница между интерфейсно-ориентированным, объектно-ориентированным и аспектно-ориентированным программированием?

Аспектно-ориентированное

Аспектно-ориентированное програмирование базируется на изучении того сколько и каких компонент или частей требуется для взаимодействия с системой. Основным для АОП является взаимодействие этих элементов.

Интерфейсно-ориентированное

Интерфейсно-ориентированное программирование это подход основанный на программировании по контракту. Ни одна часть интерфейса не зависит от того как реализована другая, вся коммуникация между ними описана в контракте. Веб-сервисы на основе WSDL наиболее известный пример этого подхода.

Объектно-ориентированное

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

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

Инкапсуляция позволяет работать абстракции пряча детали реализации класса от вызывающих его. (Публичные и приватные поля)

Наследование позволяет базовым(родительским) классам содержать общую функциональность и передавать ее всем своим классам-потомкам. Класс Figure(фигура) может иметь поле цвет, которое будет унаследовано его классами-потомками Square(квадрат) или Circle(круг).

Полиморфизм позволяет реализовывать одноименные публичные методы, позволяя различным классам выполнять различные действия при одном и том же вызове. То есть объекты классов Square и Circle могут отображаться(реализовывать метод render) поразному несмотря не то, что они оба подклассы Shape, метод render определен в Shape. (Overriding)

Что такое CLR? Что такое IL? Что такое CLS?

CLR ("Common Language Runtime", "общеязыковая исполняющая среда") — это компонент .NET Framework, основной задачей которого является управление интерпретацией и исполнением кода IL. CLR отвечает за изоляцию памяти приложений, проверку типов, безопасность кода, преобразование IL в машинный код.

IL (Intermediate Language) — код, содержащий набор инструкций, не зависящих от платформы. Иными словами, после компиляции исходного кода он преобразуется не в код для какой-то определенной платформы, а в промежуточный код на языке IL.

CLS ("Common Language Specification", общеязыковая спецификация) — это набор правил, следуя которым разработчики достигают бесконфликтной работы во всех языках .NET.

Что такое managed code?

Управляемый код (managed code) — это код, работающий в среде CLR. Содержит метаданные, в которых находится информация для среды выполнения — о типах, членах и ссылках, используемых в коде.

Что такое assembly?

Сборка (assembly) — один или несколько файлов, содержащий логический набор функциональности (код и другие данные, связанные с кодом). Бывают статические сборки, хранящиеся на диске, и динамические, которые создаются во время выполнения программы. Сборка — это базовый блок приложения, все ресурсы, относящиеся к ней, доступны или только внутри этого блока, или экспортируются наружу. При выполнении сборка задает область видимости имен и следит за ее соблюдением.

Что такое приватные и совместные сборки?

Сборки (assembly) бывают двух типов — приватные (private), которые использует только само приложение, и совместные (shared), использующиеся набором приложений. При приватных сборках приложение изолируется от внешнего воздействия программ и операционной системы, отпадает необходимость заботиться об уникальности имен в глобальном пространстве имен. Чтобы сделать сборку совместной, ее необходимо специальным образом собрать и присвоить ей строгое шифрованное имя.

Что такое assembly manifest?

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

В чем разница между понятиями namespace и assembly?

Namespace (пространство имен) является логическим соглашением, используемым во время разработки, в то время как assembly (сборка) устанавливает область видимости имени в процессе выполнения.

В чем различие между Value Type и Reference Type?

Value Type находятся в стеке, а Reference Type в куче.

Когда объект удаляется сборщиком мусора?

Объект удаляется сборщиком мусора, когда на него не остается ссылок.

Что такое Code Access Security (CAS)?

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

Что такое attribute?

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

Как обеспечить использование именованных параметров в конструкторе атрибута?

Конструкторы атрибутов могут принимать именованные параметры — поля и свойства атрибутов. При задании именованного параметра в конструктор атрибута передается имя свойства или поля, которое должно принять этот параметр. При чем эти свойства и поля должны быть открытыми. Если именованные параметры передаются, то они обязательно должны идти следом за позиционными параметрами, которые явно указаны в конструкторе атрибута. Указание именованных параметров не является обязательным, поэтому при проектировании атрибутов необходимо помнить о том, что некоторые его поля или свойства могут быть не проинициализированы. Пример использования именованных параметров в конструкторе атрибута:

Здесь передается 1 позиционный параметр — строка "Kernel32" и 2 именованных параметра, которые устанавливают открытые поля CharSet и SetLastError в значения CharSet.Auto и true соответственно.

В чем различие между Finalize и Dispose?

Dispose — обеспечивает явный контроль над ресурсами, используемыми объектом, а Finalize — неявный, используемый сборщиком мусора.

Что такое Boxing и Unboxing?

  1. Выделяется память в управляемой куче.
  2. Совершается копирование полей размерного типа в память, которая была выделена в куче.
  3. Возвращается адрес объекта.

Что такое GAC?

GAC — это глобальный кэш сборок. В нем хранятся совместно используемые сборки. Обычно это каталог С:\Windows\Assembly\GAC. Этот каталог имеет определенную структуру, в котором хранятся подкаталоги, имена которых сгенерированы по определенному алгоритму. В GAC можно поместить только сборки со строгими именами. Для того, чтобы поместить сборку в GAC, используют специальный инструмент GACUtil.exe, который знает всю внутреннюю структуру GAC и может генерировать имена подкаталогов надлежащим образом. Регистрировать в GAC сборки необходимо для того, чтобы избежать конфликтов имен сборок. Приведем пример: две компании выпустили сборку и назвали ее одним именем Calculus. Если мы скопируем эту сборку в каталог, в котором уже находится сборка с таким же именем, то мы затрем сборку, которая ранее могла использоваться каким-то приложением. Это приложение с новой сборкой теперь работать не сможет. Решением этой проблемы будет регистрация этих двух сборок в GAC, в котором для каждой будет создан отдельный каталог.

Какие типы можно использовать в предложении foreach?

Массивы, коллекции. Классы в которых реализован интерфейс System.Collections.IEnumerable.

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

Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).

Что означает модификатор virtual?

При наследовании класса. Данный метод м.б. переопределен в производных классах с помощью ключевого слова override.

Чем отличается event от delegate?

Delegate – это по сути указатель на функцию.

В С# модель издатель — подписчик, где класс публикует событие, которое он может инициировать, и любые классы могут подписаться на это событие. Метод, вызываемый при возникновении события, определяется делегатом

Может ли класс реализовать два интерфейса, у которых объявлены одинаковые методы? Каким образом?

Поддерживает ли C# множественное наследование?

С# поддерживает множественное наследование в виде наследования от класса и нескольких интерфейсов, или просто от нескольких интерфейсов.

Но не поддерживает наследование от нескольких классов.

Кому доступны переменные с модификатором protected на уровне класса?

Наследуются ли переменные с модификатором private?

Да, но они не являются доступными.

Опишите модификатор “protected internal”

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

Назовите класс .NET, от которого наследуются все классы?

Что обозначает термин immutable (неизменяемый)?

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

Какая разница между классами System.String и System.Text.StringBuilder?

Данные, хранящиеся в классе System.String и есть неизменяемые (immutable). Класс System.StringBuilder разрабатывался так, чтобы над изменяемой строкой можно было проделать множество операций. То есть при каждой операции над объектом класса System.String происходит перенос данных в новую область памяти, что влияет на производительность программы.

Какое преимущество использования класса System.Text.StringBuilder перед System.String?

Класс StringBuilder более эффективен в случае работы с большим количеством строк. Объекты класса System.String неизменяемы, поэтому при каждом изменении строки создаётся новый объект в памяти.

Можно ли хранить разные типы данных в объекте класса System.Array?

Объясните разницу между System.Array.CopyTo() и System.Array.Clone()?

Первая операция осуществляет глубокое копирование массива, а вторая – поверхностное. Поверхностное копирование массива копирует только сами элементы объекта класса Array, независимо от того являются они ссылочными или значимыми типами. Копирования объектов, на которые ссылаются ссылочные типы не происходит. Ссылки в новом объекте класса Array указывают на те же объекты, что и ссылки в оригинальном массиве Array. Глубокое копирование копирует как элементы класса Array, так и объекты, на которые они явно или неявно ссылаются.

Как отсортировать элементы массива в убывающем порядке?

Нужно вызвать метод Sort(), а затем метод Reverse().

As, is – что это, как применяется?

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

Выражение o is Employee проверяет, является ли переменная o объектом типа Employee.

Операторы приведения типов.

If(o is Employee) <

Employee e = (Employee) o;

>

В чем разница между throw ex; и throw; ?

  • throw повторно выбрасывает исключение (re-throw), которое было обнаружено, и сохраняет трассировку стека (путь к источнику исключения).
  • throw ex генерирует одно и то же исключение, но сбрасывает трассировку стека на метод, где делается throw ex.

Как работает return в try-catch-finally?

Алгоритм приблизительно такой:

  1. Выполняется код перед оператором return;
  2. Выражение в return оценивается
  3. Выполняется finally блок
  4. Возвращается результат, посчитанный на шаге 2

Рассмотрим следующий код:

Что мы получим на экране?

почему так? Мы не меняли результат который был получен на шаге 2, мы изменили значение свойства ссылочного типа, но не меняли сам объект

Если мы перепишем блок finally следующим образом:

то получим в ответ

Если мы проделаем это с value type, результат будет тем же. Т.е в блоке finally нельзя изменить возвращаемый объект, но можно менять свойства объекта.

Вопросы по классам

Какой синтаксис используется для указания класса родителя в C#?

После имени класса наследника нужно поставить двоеточие и указать имя базового класса. Пример:

Можно ли запретить наследование от своего собственного класса?

Можно ли разрешить наследование класса, но запретить перекрытие метода?

Да. Указываем класс как public, а метод как sealed.

Что такое абстрактный класс?

Это класс, объект которого не может быть создан. Такой класс должен иметь класс-наследник с реализацией абстрактных методов. Абстрактный класс – это фактически чертёж нормального класса без реализации.

В каком случае вы обязаны объявить класс абстрактным?

  1. В том случае, если класс является наследником абстрактного класса, но не все методы базового класса перекрыты и имеют реализацию.
  2. В том случае, если хотя бы один метод класса является абстрактным.

Что такое интерфейс класса?

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

Почему нельзя указать модификатор видимости для методов интерфейса?

Потому что все они должны иметь модификатор public, который и установлен по умолчанию.

Можно ли наследовать от нескольких интерфейсов?

Назовите отличия между интерфейсом и абстрактным классом?

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

Назовите различия между структурами и классами.

Для С# классы System.Object, System.Exception, System.File-Stream и System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередь размерные типы в документации называются структурами (structure) и перечислениями (enumeration). Например, структуры System.In132, System.Boolean, System.Decimal, System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyle являются размерными типами (хранятся обычно в стеке потока, но могут быть встроены в ссылочные типы).

В чем разница между абстрактными и виртуальными классами? Между виртуальными и абстрактными методами?

Абстрактный класс это класс, содержащий хотя бы один метод (abstract).. Виртуальный метод имеет реализацию и м.б. переопределен в производном классе. Абстрактный метод не имеет реализацию, только описание метода, который д.б. реализован в производных классах.

Dispose(), Finalize() – что это за методы, как используются в .NET?

Используются для освобождения ресурсов. Применяя метод Dispose, вы должны обеспечить неявную очистку методом Finalize. Если программисту не удалось вызвать метод Dispose, использование метода Finalize предотвращает постоянную утечку ресурсов.

Для чего в .NET используется конструкция using(…)<…>? Причем тут IDisposable?

Значение Using непосредственно связано с интерфейсом IDisposable. Интерфейс IDisposable представляет нам возможность быстро освободить общие ресурсы, не полагаясь на автоматический сборщик мусора (garbage collector). Конструкция Using позволяет вызывать метод Dispose автоматически, как только нужный объект выйдет за блок Using.

Вопросы по методам и свойствам

Назовите явное имя параметра, передаваемого в метод set свойства класса?

value. Тип этого параметра определяется типом свойства.

Что обозначает ключевое слово “virtual” для метода или свойства?

То, что метод или свойство может быть перекрыто.

Чем перекрытый метод отличается от перегруженного метода?

При перекрывании метода мы изменяем его поведение в классе наследнике. Перегрузка метода просто приводит к использованию другого метода с тем же именем внутри класса.

Можно ли объявить перекрытый метод статическим, если перекрываемый метод не является статическим?

Нет. Сигнатура виртуального метода должна остаться постоянной, кроме замены ключевого слова virtual на ключевое слово override.

Вопросы по сборкам

Что такое «сопутствующая сборка» (satellite assembly)?

Сборки, помеченные определенными региональными стандартами, называются сателлитными сборками

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

Те, кто занимается программированием рано или поздно сталкивается с необходимостью прохождения технического собеседования у потенциального работодателя.

О том, что спрашивают на собеседовании у C++ программистов, а также об ответах на эти вопросы и пойдет речь в данном посте.

Предисловие

Небольшая вводная часть в виде вопрос-ответ, чтобы разъяснить некоторые моменты и постараться ответить на возможные вопросы по этому посту.

Зачем все это?
Хочется собрать реальные вопросы и ответы на них в одном посте. Т.к. меня не устраивают те, что я вижу в интернете, они порой слишком размазанные (например, 75 страниц на геймдеве), или рассматривающие всего несколько примеров, или с ошибками, которые уже никто не исправит, или с ссылками на уже мертвые топики, или какие-то надуманные,… список можно продолжать.

В общем хочется иметь список с самыми популярными вопросами по данной теме, и если, вдруг, понадобится освежить знания, чтобы не приходилось лезть в какие-то записки, запускать IDE или гуглить, а можно было открыть одно место и там все прочитать.

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

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

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

Сейчас я планирую написать первые 20 вопросов, а если эта тема будет востребована, то буду постепенно добавлять новые.

У вас ошибка в коде, как вы ее проглядели?
Людям свойственно ошибаться и я не считаю себя гуру способному писать безошибочно. И это C++, здесь вероятность ошибиться еще больше.

Если вы видите ошибку, напишите о ней, и я обязательно ее исправлю.

1. Зачем нужен виртуальный деструктор?

Ответ: Чтобы избежать возможной утечки ресурсов или другого неконтролируемого поведения объекта, в логику работы которого включен вызов деструктора.
Пример:

Output:
Hello from

Derived()
Hello from

Без ключевого слова virtual у родительского класса Base деструктор порожденного класса не был бы вызван. Т.е. вызвался бы только

Output:
Hello from

Более подробно об этом написал GooRoo здесь. Наглядный пример возможной утечки в следующем вопросе.

2. Что стоит помнить при использовании исключений в конструкторе объекта?

Ответ: Если исключение не обработано, то c логической точки зрения разрушается объект, который еще не создан, а с технической, так как он еще не создан, то и деструктор этого объекта не будет вызван.
Пример:

Output:
Hello from Base()
Exception message: Something failed

Я немного модифицировал предыдущий пример, чтобы проблема была наглядней. Здесь объект m_hFile (если был открыт) утечет т.к. до CloseHandle() выполнение не дойдет. Т.е. имеем такие же проблемы как в первом примере: возможная утечка ресурсов или другие проблемы из-за нарушения логики работы класса.

Здесь могут спросить: «Как бы вы поступили при подобной ситуации». Правильный ответ: «Воспользовался бы умными указателями». Простой пример умного указателя:

Теперь и без вызова деструктора Base хэндл будет закрыт, т.к. при уничтожении класса Base будет уничтожен объект m_hFile класса CHandle, в деструкторе которого и будет закрыт хэндл.

Изобретать велосипед, конечно, не надо, все уже написано до нас, это пример который можно написать на бумажке при соответствующем вопросе. А так есть boost, Loki, ATL и т.п., где это уже реализовано.

3. Для каких целей применяется ключевое слово const?
  1. Позволяет задать константность объекта
  2. Позволяет задать константность указателя
  3. Позволяет указать, что данный метод не модифицирует члены класса, т.е. сохраняет состояние объекта

Пример 2. Не можем изменить указатель на объект:

Пример 3. Не можем изменить члены класса:

Дополнение: константный метод может изменять члены класса, если они объявлены как mutable. Подробнее про mutable можно прочитать у Алены CPP здесь.

4. Можете ли вы написать пример какого-нибудь алгоритма сортировки?

Ответ: Пузырьковая сортировка, для контейнеров, без временных переменных:

5. Можете ли вы написать код для переворота строки?

Ответ: Код переворота строки для контейнеров, без временных переменных, не осуществляющий прохода по всей строке:

6. Как защитить объект от копирования?

Ответ: Сделать private конструктор копирования и оператор =.
Пример:

7. В чем разница между struct и class?

Ответ: Практически ни в чем. В struct модификаторы доступа по умолчанию public, в class private. Также отличается и наследование по умолчанию, у structpublic, у classprivate.
Пример:

8. Каким свойством должен обладать объект, чтобы его можно было добавить в ассоциативные контейнеры в качестве ключа?

Ответ: Т.к. значения в ассоциативных контейнерах хранятся отсортированными, то объект должен реализовывать оператор сравнения <, а остальные операторы сравнения могут быть выражены через него.
Пример:

Без реализации operator < объект класса Foo нельзя было бы добавить в set, т.к. был бы не определен их порядок внутри set’а.

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

Помимо этого, для контейнеров может быть определен класс сравнения (Comparison class), в котором будет определена логика сравнения объектов, реализованная через тот же оператор меньше.

9. Сколько в памяти занимает произвольная структура?

Ответ: sizeof всех членов + остаток для выравнивания (по умолчанию выравнивание 4 байта) + sizeof указателя на vtable (если есть виртуальные функции) + указатели на классы предков, от которых было сделано виртуальное наследование (размер указателя * количество классов)
Пример:

10. Как сгенерировать pure virtual function call исключение?

Ответ: Нужно вызвать чисто виртуальный метод в конструкторе родительского класса т.е. до создания дочернего, в котором этот метод реализован. Т.к. современный компилятор не даст это сделать напрямую, то нужно будет использовать промежуточный метод.
Пример:

11. В чем отличие vector от deque?

Ответ: Здесь вспоминают о наличии у deque методов push_front и pop_front. Но основное отличие в организации памяти, у vector она как у обычного Си-массива, т.е. последовательный и непрерывный набор байт, а у deque это фрагменты с разрывами. За счет этого отличия vector всегда можно привести к обычному массиву или скопировать целиком участок памяти, но зато у deque операции вставки/удаления в начало быстрее (O(1) против O(n)), ввиду того, что не нужно перемещать остальные значения.

12. Что дают разные модификаторы при наследовании?

Ответ: Изменяют зону видимости членов базового класса.
Пример:

При private наследовании protected и public члены становятся private. При protected наследовании public становится protected. А при public ничего не изменяется. Более подробно об этом Алена писала вот здесь.

13. Что такое инкапсуляция?

Ответ (Wiki): Инкапсуляция — свойство языка программирования, позволяющее объединить и защитить данные и код в объектe и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта.

Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public.

Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected.

14. Что такое полиморфизм?

Ответ (Wiki): Возможность объектов с одинаковой спецификацией иметь различную реализацию.
Пример:

Т.е. есть базовый класс фигура, и от него унаследованы два класса квадрат и круг, имеющие собственную реализацию метода Draw().

15. В чем отличие malloc от new?

Ответ: malloc — выделение блока памяти в стиле Си, опасное с точки зрения приведения типов (non-typesafe), т.к. возвращает void * и требует обязательного приведения. new — выделение блока памяти и последующий вызов конструктора, безопасное с точки зрения приведения типов (typesafe), т.к. тип возвращаемого значения определен заранее.

16. Что такое чисто виртуальный метод и абстрактный класс?

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

17. Для чего используется вызов throw без аргументов?

Ответ: Для повторного возбуждения предыдущего исключения и направления его следующему обработчику.
Пример:

18. В чем различия между delete и delete[]?

Ответ: delete предназначен для уничтожения объектов, память под которые выделена при помощи new(). delete[] для объектов выделенных при помощи оператора new[]().
Пример:

При неправильном использовании оператора delete (например, delete вместо delete[]) результат будет: undefined behavior.

19. Что стоит учитывать при использовании auto_ptr?

Ответ: Так как данный умный указатель реализует подход разрушающего копирования, то при присвоении его другому умному указателю оригинальный потеряет свое значение. А так же его нельзя использовать в стандартных STL контейнерах.
Пример:

Также ввиду того, что в деструкторе auto_ptr вызывается оператор delete, нельзя хранить объекты созданные при помощи new[](). Именно из-за этого нюанса boost предоставляет умные указатели в двух вариантах, для просто объекта и их коллекции, например, shared_ptr и shared_array.

20. Для чего используется ключевое слово volatile?

Ответ: Для указания компилятору, что доступ к переменной может осуществляться из мест, неподконтрольных ему. А как следствие, что работу с данной переменной не нужно подвергать разного рода оптимизациям.
Пример:

Т.е. если volatile присутствует в каком-то условии, которое не меняется со временем, то компилятор может оптимизировать его, чтобы избежать ненужных проверок, при использовании volatile компилятор скорее всего не будет этого делать.
Пример:

400+ вопросов с собеседований по C++

В редакции сайта DOU.UA опросили специалистов, проводящих технические интервью, и составили список вопросов, которые вам могут задать на собеседованиях по C++. Мы предлагаем вам перевод этого материала на русский язык. Учтите, что специализаций довольно много, поэтому выбирайте свое направление и готовьтесь.

Junior

Общие вопросы

1. В чем заключаются основные принципы ООП?

3. Код работает неправильно. Что делать?

4. Объясните такие структуры данных, как стек и очередь.

5. Какие книги, связанные с программированием, вы читали? Что почерпнули для себя?

6. Что интересного нашли в новых стандартах С++ 17 С++ 20?

7. Что такое таблица ASCII?

9. Что такое паттерны проектирования и для чего их используют?

10. Паттерны Singleton, Strategy, Template-Method, Decorator?

11. Для чего нужны модульные тесты?

12. Как разница между модульными и интеграционными тестами?

13. Что такое TDD?

Метапрограммирование

14. Что такое шаблонный класс и шаблонная функция?

15. Что такое конструкторы? Какие типы вы знаете?

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

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

18. Что такое инстанциация шаблона?

19. Что такое специализация шаблона? Частичная специализация шаблона?

20. Расскажите об имплементации шаблонных классов в срр-файле.

Препроцессор и компиляция

21. Как проходит процесс компиляции срр-файлов в бинарный файл?

22. Что такое препроцессор?

23. Как работает препроцессор?

24. Какие знаете его команды?

25. Как работает директива include?

26. Как работает директива define?

27. Что именно линкует линкер?

28. Что такое оптимизация компилятора?

29. Что такое флажки компиляции?

30. Как защитить хедер от повторного включения?

31. Что делает директива include?

32. Как работают макросы?

33. Как static влияет на глобальные / локальные переменные?

34. Как сonst влияет на переменную?

35. Какие варианты использования extern вы знаете?

36. Какие варианты использования volatile вы знаете?

37. Какие есть битовые операции?

38. Что такое булева алгебра?

39. Расскажите об этапах разработки библиотеки или программы.

40. Что такое алгоритмы сортировки и какие вы знаете?

41. Какие алгоритмы работы со строками знаете?

42. Какие алгоритмы на графах знаете?

43. Где может храниться переменная?

44. Какая разница между calloc и malloc?

45. Для чего используют realloc?

46. Что такое указатель?

47. Какой размер имеет указатель и от чего он зависит?

48. Какие есть операции с указателями?

49. Что такое struct?

50. Как определить размер структур?

51. Что такое выравнивание в структурах?

52. Что такое union?

53. Каков размер union?

C++ / OOP

54. Что такое класс?

55. Какие основные типы данных в C++?

56. Что такое инкапсуляция? Как она реализуется в C++?

57. Какие есть встроенные типы в С++?

58. Что такое enum?

59. Как соотносится класс и объект?

60. Какая разница между структурой и классом?

61. В чем разница между private / protected / public и где они используются?

62. Какие методы класса являются стандартными для класса?

63. Что такое абстрактный класс и зачем он нужен?

64. Сколько занимает памяти объект пустой класс class A<>; ?

65. Что станет с функцией, если к ней добавить ключевое слово static? В контексте члена класса? В контексте метода класса?

66. Какие особенности статических полей класса?

67. В чем особенность константных методов-членов класса?

68. Как изменить поле класса в константном методе класса?

69. Какие методы можно вызвать из константных объектов?

70. Что такое куча и стек? Различия, принцип работы.

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

72. Для чего нужен указатель на функцию? Как его объявить?

73. Что будет, если забыть вызвать delete? Когда освободится та память?

74. Что такое умный указатель? Какие умные указатели есть в стандартной библиотеке?

75. Как работает std::unique_ptr?

76. Как работает std::shared_ptr?

77. Расскажите о константности переменной, ссылки, указателя. Что такое константный указатель и указатель на константу? Размер указателя в памяти?

78. Расскажите о передаче аргументов по значению, ссылке и указателю.

79. Расскажите о порядке вычисления аргументов функции.

80. Что случится, если вернуть ссылку на временный объект?

81. Что такое перегрузка функции? Виды перегрузки.

82. Что такое явное и неявное приведение типов в С++? Расскажите о функциях явного приведения типов в C++.

83. Что такое инициализация переменной в if?

84. Что такое ленивые вычисления в С++?

85. Расскажите о циклах for и range-for.

86. Что делает ключевое слово auto? auto-определение return-типа, аргументов функции?

87. Чем отличаются delete и delete[]? Что случится, если вызвать delete у объекта, созданного через new[]?

88. Обработка ошибок в С++. Какие конструкции используют при обработке exception?

89. Можно ли выбрасывать exception из конструктора? Какие поля будут сконструированы, какие поля будут разрушены?

90. Что такое memory leak?

91. Можно ли выбрасывать exception с деструктора?

92. Как отловить деление на 0 в С++?

93. Как работают константные методы?

94. Что такое лямбда-функция в С++? Как получить доступ к переменным во внешней области видимости?

95. Для чего использовать namespace, anonymous namespace?

96. Как вызвать объект с nested namespace?

97. Как работают inline-функции? Может ли такая функция быть рекурсивной?

98. Что такое полиморфизм?

99. Для чего используется наследование?

100. Какие бывают типы наследования?

101. Для чего используют виртуальное наследование?

102. Как можно решить проблему ромбовидного наследования без использования виртуального наследования?

103. Что случится, если класс-наследник передать по значению в функцию, которая принимает базовый класс?

104. Что случится, если унаследоваться от базового класса, не имеющего виртуального конструктора?

105. Что случится, если вызвать переопределенную virtual function из конструктора? Может конструктор быть виртуальным?

106. Может ли иметь имплементацию pure virtual function? Что случится, если вызвать pure virtual function из конструктора?

107. Какие методы генерируются для класса по умолчанию? В каком случае такие методы не будут генерироваться? Как заставить компилятор добавить / удалить эти методы?

108. Как запретить наследовать класс?

109. Каков порядок конструирования и разрушения классов в иерархии? Порядок инициализации полей класса?

110. Какие есть способы инициализации полей класса?

111. Может ли деструктор быть виртуальным?

112. Что делает ключевое слово virtual?

113. Для чего используют виртуальный деструктор?

114. Что такое глубокое копирование?

115. Что такое виртуальные функции и зачем они нужны?

116. Как защитить объект от копирования?

117. Что такое семантика перемещения?

STL / Algorithms

118. Из чего состоит STL?

119. Какие алгоритмы применяли с STL? В чем преимущество использования алгоритмов перед собственноручно написанными функциями?

120. Расскажите о контейнерах стандартной библиотеки vector, list, map, unordered_map.

121. Какие знаете типы итераторов? Чем они отличаются? В каких контейнерах используются?

122. Какая разница между std::set, std::map std::unordered_multimap?

123. Что такое идиома remove-erase?

124. Как получить наименьшее значение типа?

125. Какая разница между std::map и std::hashmap?

126. Как подсчитать количество элементов в std::list?

127. Что такое сложность алгоритма и от чего она зависит?

128. В чем разница между vector и list и в каких случаях их лучше использовать?

Многопоточность

129. Что вам известно о многопоточности?

130. Что общего и отличного в процессах и потоках?

131. Как синхронизировать передачи информации между потоками?

132. Какая разница между мьютекс и семафором?

133. Что такое deadlock?

134. Является ли С++ thread-safe?

135. Что такое race-condition?

136. Как избежать состояния гонки?

137. Что такое атомарная операция?

138. Как работать с std::mutex?

Networking

139. Что такое сокет?

140. Какие операции можно делать с сокетом?

141. Какая информация нужна, чтобы создать сокет?

142. Какие бывают модели сетей?

143. Расскажите об уровнях модели OSI.

144. Расскажите об уровнях модели TCP/IP.

145. Что такое IP-адрес?

146. Для чего используется маска подсети?

147. Какая разница между IPv4 и IPv6?

148. Сколько памяти необходимо для хранения IPv4?

150. Сколько максимально может быть портов?

151. Какая разница между TCP и UDP?

152. Для чего такой ненадежный UDP-протокол?

OS / Linux

153. Что такое менеджер пакетов?

154. Какие бывают менеджеры пакетов?

155. Какие бывают дистрибутивы Linux?

156. Что такое PID?

157. Для чего используют файловые дескрипторы?

158. Расскажите о стандартных файловых дескрипторах процесса.

159. Что такое Pipe?

160. Что такое Named Pipe?

161. Что такое UID?

SCM / CI / CD

163. Какие есть виды SCM?

166. Какие этапы во время коммита изменений?

167. Разница между git fetch и git pull?

168. Какие есть этапы решения merge conflict?

Практические задания

169. Посчитайте количество единиц в произвольном числе.

170. Структура по типу «односвязный список». Напишите функцию, которая разворачивает список. То есть первый элемент становится последним, а последний — первым.

171. Напишите реализацию функции int atoi(const char * str); преобразования строки в число.

172. Для структуры типа односвязный список напишите функцию вставки элемента.

173. Реализуйте класс vector.

174. Реализуйте бинарный поиск в массиве.

175. Реализуйте любую сортировку.

176. Реализуйте макрос для сравнения двух строк.

177. Реализуйте реверс строк.

178. Реализуйте перевода числа из строки в int.

179. Реализуйте подсчет слов в предложении.

180. Реализуйте подсчет чисел Фибоначчи.

181. Найдите такие элементы двух массивов, которые встречаются только в каждом из них. Желательно использовать STL.

182. Удалите из unordered_map элементы, которые делятся на 2, и выведите ключи этих элементов.

183. Напишите класс для логирования, который мог бы логировать в консоль или файл.

184. Напишите функцию для определения, является ли указанный год високосным.

185. Напишите функцию для определения, является ли заданное слово палиндромом.

186. Напишите реализацию паттерна Singleton.

187. Напишите реализацию std::vector с операциями: push_back, push_front, pop_back, pop_front, size, clear.

188. Напишите рекурсивный поиск значения в дереве бинарного поиска.

189. Напишите функцию, которая проверяет, является ли дерево сбалансированным.

190. Напишите функцию для поиска уникального элемента в массиве.

Middle

Общие вопросы

1. Какие курсы прошли или книги прочитали за этот год? Чему научились?

2. Что нравится и не нравится в С++? Чего не хватает?

3. Что интересного нашли в новых стандартах С++ 17 С++ 20 (конкретные фичи)?

4. Расскажите о фичах, которые появились в разных версиях языка.

5. Расскажите о модели памяти, которая появилась в стандарте С++ 11.

6. Что такое сериализация? Какие библиотеки знаете?

7. Какие знаете паттерны проектирования?

8. Что такое операционная система? Какие существуют типы по назначению?

9. Назовите основные составляющие и принципы работы ОС Linux в качестве примера системы общего назначения.

10.Что такое SFINAE и PIMPL?

11. Назовите порождающие, структурные и поведенческие паттерны программирования и приведите примеры их использования.

Препроцессор и компиляция

12. Расскажите о системах автоматизации билд-процесса.

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

14. В чем разница между исполнительным файлом и динамичной библиотекой?

15. Что такое DLL hell?

16. Что такое флажки компиляции (fPIC)?

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

18. Что нужно для использования сторонней библиотеки?

19. Что такое internal linkage?

20. Что будет, если дважды вызвать free?

21. Как происходит вызов функции?

22. Как происходит передача параметров в функцию?

23. Как обрабатывается константность переменных?

24. Что означает ключевое слово inline?

25. Для чего используют выравнивания, можно ли его контролировать?

26. Расскажите о битовых полях.

27. Для чего нужен extern «C»?

28. Что будет, если в двух файлах сделать функцию с одинаковым именем и параметрами? На каком этапе возникнет ошибка?

29. Как экспортировать / импортировать функции из динамической библиотеки?

30. Какая разница между С-style приведением типов и C++ приведением?

31. Что такое явное и неявное приведение типов в С++? Зачем делать explicit-конструктор?

32. Что такое Uniform initialization? Aggregate initialization?

33. Что такое Reference to temporary object? Как продлить время жизни временного объекта?

34. Что такое делегирующий конструктор?

35. Что такое список инициализации?

36. Каков порядок инициализации полей класса? Что случится, если конструктор инициализирует поля в другом порядке?

37. Что случится, если инициализировать поле другим полем?

38. Что такое copy elision? Сколько раз будет вызван конструктор / деструктор у объекта, который возвращают по значению?

39. Что такое move-семантика?

40. В каких случаях будет сгенерирован конструктор копирования?

41. Чем отличается конструктор копирования от оператора присваивания?

42. При каких условиях в конструкторе можно выбросить exception?

43. Что такое конструктор по умолчанию? Для чего нужны default и delete?

44. Чем отличается интерфейс от абстрактного класса?

45. Какие виды полиморфизма в С++?

46. Как реализовано наследование в большинстве компиляторов?

47. Множественное наследование: за и против.

48. Виртуальное наследование и порядок конструирования.

49. Зачем использовать override?

50. Какие есть правила вывода типа при использовании auto? В каких случаях auto может привести к нежелательному копирования объекта?

51. Расскажите обо всех возможных способах использования ключевого слова static в С++. Что такое static initialization order fiasco?

52. Что делает вызов throw; в блоке catch?

53. Чем отличается constexpr от const?

54. Что такое const correctness?

55. В каком случае можно использовать const_cast?

56. Что такое ключевое слово mutable и когда его нужно использовать?

57. Что такое ключевое слово friend и когда его нужно использовать?

58. Расскажите о лямбда-выражениях в С++ и доступе к переменным во внешней области видимости, захвате this в лямбду и времени жизни лямбды и захваченных переменных.

59. Что такое функтор? Напишите пример.

60. Что такое специализация шаблона?

61. Что такое dynamic_cast и run-time type identification?

62. Что такое exception? Как бросить и поймать?

63. Что будет, если бросить exception из конструктора? А из деструктора?

64. Что будет, если не поймать exception?

65. Что произойдет, если exception выйдет за пределы блока noexcept функции?

66. Для чего можно использовать приватное наследование?

67. Что такое контракт функции?

68. Что такое vptr и vtable?

69. Где содержится vptr?

70. Где содержится vtable?

71. Какая разница между overload и override?

72. Как компилятор различает члены класса и обычные переменные в функциях?

73. Зачем используют exceptions?

74. Что такое блоки try-throw-catch?

75. Расскажите о логике catch-блоков.

76. Что такое move constructor?

77. В чем разница между константным методом и неконстантным?

78. Что такое О-нотация и как определить сложность любого алгоритма?

79. Что такое таблица виртуальных методов?

80. Какие функции класса автоматически генерирует компилятор, если их определить?

81. Что такое выравнивание данных?

82. Что такое exception?

83. Какие есть стандартные контейнеры и на основе каких структур они построены?

84. Что такое Undefined behavior? Приведите примеры.

85. Как определить, что в программе есть memory leak?

86. Для чего нужен std::make_shared? Чем он лучше создания std::shared_ptr через конструктор?

87. Что будет, если выделить один объем памяти, а записать больше?

88. Что такое переполнение stack?

Паттерны проектирования

89. Зачем нужны паттерны? Какие типы паттернов различают?

90. Недостатки паттерна Singleton. Когда он уместен?

91. Преимущества и недостатки PIMPL.

92. В чем разница между паттерн-фабрикой и фабричным методом? Когда использовать какой из них?

93. Что такое паттерн Observer?

94. Как контролировать состояние программы? Машину состояний? Паттерн состояние?

95. Что такое паттерн Visitor?

Метапрограммирование

96. Какие есть правила вывода типа в шаблоне?

97. Чем отличается using от typedef?

98. Сколько памяти занимает произвольная структура? Что такое выравнивание объекта?

99. Почему пустая структура занимает 1 байт? Какая минимальная единица адресации в С++?

OOP / OOD

100. Что такое SOLID? Что означает каждый из этих принципов?

101. Расскажите о паттернах проектирования.

102. Что такое Dependency Injection? Приведите пример.

103. Какие преимущества и недостатки функционального подхода?

104. Что такое принцип RAII?

105. Что такое принцип DRY?

106. Что такое принцип KISS?

107. Какие преимущества композиции перед наследованием?

STL / Algorithms

108. Какие алгоритмы с STL использовали? Каких не хватает?

109. Какими особенностями должен обладать класс, чтобы он был итератором?

110. Какие бывают итераторы?

111. Расскажите о инвалидации итераторов.

112. Как оптимизировать удаление элемента из середины вектора?

113. Как реализован vector?

114. Как реализован list?

115. Как расширить STL-контейнеры?

116. Какие есть алгоритмы в STL?

117. В чем разница между vector, deque, list, set e STL?

118. Когда надо использовать map? Когда — unordered_map? Какова сложность поиска и вставки в этих контейнерах?

119. Как проверить, есть ли в контейнере элементы? Почему вызов container.size() является плохой практикой?

120. Что такое exception safety guarantee? Какую exception safety guarantee имеют STL-контейнеры?

121. Расскажите о типах умных указателей и подсчете ссылок в них.

Многопоточность

122. Является ли С++ thread-safe?

123. В чем разница между многопоточностью и асинхронностью?

124. Что такое многопоточность? Какую функциональность предоставляет С++ для разработки многопоточных приложений? Каковы основные проблемы многопоточных приложений?

125. Как передать информацию между несколькими процессами?

126. Как синхронизировать между собой несколько процессов?

127. Какие есть особенности работы с shared memory?

128. Как работает spinlock?

129. Какие вы знаете особенности использования recursive mutex?

130. Расскажите о read-write mutex.

131. Что такое race-condition? Взаимная блокировка? Что такое критическая секция?

132. Какие избежать состояния гонки?

133. Чем отличается мьютекс от семафора?

134. Какие примитивы синхронизации реализованы в C++? Преимущества lock_guard?

135. Что случится, если exception выйдет за пределы потока? Какие инструменты есть для безопасной асинхронности в С++?

136. Чем отличается std::launch::async от std::launch::deferred?

137. Что такое атомарная операция? std::atomic?

138. Как работать с std::conditional_variable?

139. Как создать поток с помощью std::thread?

140. На сколько потоков лучше разбить задачу? От чего это зависит?

141. Как работать с std::async?

142. Thread-safe гарантии контейнеров в С++. В чем недостаток интерфейса front() + pop_fornt()?

Networking

143. Что такое TCP handshake?

144. В чем разница между TCP и UDP?

145. Расскажите о протоколах верхнего уровня.

146. В чем разница между HTTP и HTTPS?

147. Расскажите о SSL/TLS handshake.

SCM / CI / CD

148. Расскажите о процессах CI.

149. Как отредактировать коммит?

150. Расскажите об интерактивном rebase.

151. Какие могут быть способы дебаггинга кода?

152. Для чего нужны Unit test? Чем они отличаются от Functional Test?

153. Как тестировать код? Какой фреймворк используете?

154. Какие библиотеки знаете для написания тестов?

155. Что такое mock?

156. Сколько тестов нужно написать на одну функцию?

157. Что такое побочный эффект, идемпотентность и чистые функции?

158. Что такое контейнеризация и в чем ее преимущества и недостатки? Что такое Docker или иной инструмент контейнеризации?

159. Что такое CI/CD и какие преимущества дает разработчику?

160. Каковы принципы итеративных методологий?

161. Какие преимущества и недостатки code-convention?

Практические задания

162. Напишите максимально корректную реализацию класса string с конструктором копирования и оператором присваивания.

163. Напишите реализацию очереди.

164. Реализуйте функцию, которая за один проход найдет уникальный элемент в контейнере.

165. Напишите thread-safe пул потоков.

166. Напишите игру «Жизнь» в ООП-стиле.

167. Напишите класс, который получает из базы список товаров по фильтру и показывает на консоли. Напишите тесты для него.

168. Любая задача на написание кода, чтобы проверить умение проектировать интерфейсы и придерживаться принципов SOLID, DRY, KISS.

169. Напишите свою реализацию std::atomic.

170. Напишите программу для анализа графов: нахождение циклов, deadlock-состояний, циклов, недоступных состояний.

171. Напишите программу, проверяющую, что в системе запущен только один ее экземпляр. Решение должно быть cross-platform.

172. Проанализируйте C++ код с точки зрения качества: выявить потенциальные memory leak, нерациональное использование STL-контейнеров, алгоритмов, неоптимальные конструкции и тому подобное.

173. Напишите код для решения судоку.

174. Напишите код, который найдет зацикливание в односвязном списке.

Senior

Общие вопросы

1.Как вы понимаете SOLID?

2. Как разработать систему плагинов на С++?

3. Что такое RPC? Какие библиотеки знаете?

4. На что обращать внимание при проведении code review?

5. Какие есть проблемы при написании кроссплатформенного кода? На что обращать внимание?

6. Что делать, если код работает медленно?

7. Какие есть способы и методология измерения быстродействия кода? Как можно устранить / уменьшить влияние замеров на быстродействие?

8.Что такое SFINAE? Для чего используется?

9. Что такое метапрограммирование? С помощью чего реализуется на С++?

10. Как использовать variadic templates?

11. Как тестировать закрытые методы?

12. Как считать покрытие тестами? Нужно ли это делать?

13.Что такое cache miss и как это выявить?

14. Что такое SIMD-инструкции? Каковы необходимые условия и способы их использования?

15. Что такое покрытие кода и как оно обеспечивается?

16. Опишите принципы lock-free структур данных и свой опыт работы с ними.

Препроцессор и компиляция

17. Расскажите о построении билд-системы.

18. Как работать с билд-системами: Make, CMake.

19. Как интегрировать third-party в проект?

20. Что такое барьеры памяти?

21. Расскажите о работе с сырыми указателями и ручном управлении памятью.

22. Что такое статический анализатор кода? Какие знаете?

23. Что такое динамический анализатор кода? Какие знаете?

24. Проект медленно собирается. Как можно ускорить?

25. Расскажите об использовании realloc в контейнерах.

26. Как работают шаблоны?

27. Расскажите о специализации шаблонов.

28. Как работает RTTI?

29. Можно ли использовать exception в конструкторе / деструкторе?

30. Что такое rvalue и lvalue?

31. В чем особенности контейнеров std::set, std::map, std::unordered_map, std::hash?

32. Что такое placement new? Для чего используют? Как сделать placement delete?

33. Как размещается в памяти класс с множественным наследованием и виртуальными функциями?

34. Как работают точки останова?

35. Что такое уязвимости? Механизм их работы?

36. Как написать собственный std::shared_ptr?

37. Что такое curiously recurring template pattern?

38. Опишите назначение и принцип работы std::shared_ptr, std::unique_ptr и std::weak_ptr.

39. Каково назначение и различия использования std::variant и std::any?

40. Какие улучшения получил std::search в С++ 17?

41. Что такое copy elision и когда становится возможным? Какие особенности для разных стандартов?

42. Что такое Return Value Optimization?

OOP / OOD

43. Поясните принципы SOLID.

44. Поясните принципы KISS.

45. Поясните принципы YAGNI.

46. Какие есть подходы к оптимизации кода?

47. На что стоит обращать внимание при code review?

48. Какие есть паттерны проектирования? Почему не советуют использовать Singleton?

49. Что такое статический полиморфизм?

STL / Algorithms

50. Когда std::vector может использовать std::move?

51. Расскажите о своем любимом алгоритме поиска.

52. Что такое lock-free и wait-free алгоритмы? В чем их отличия и способы реализации?

53. Опишите назначения execution policy для параллельных алгоритмов.

Многопоточность

54. Расскажите о построении API, рассчитанных на многопоточное использование.

55. В чем разница между kernel-level и user-level потоками?

56. Что такое coroutine?

57. Что делает спецификатор thread_local?

58. Как реализовать синхронизацию в задаче producer-consumer?

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

SCM / CI / CD

60. Расскажите о настройке процесса менеджмента ветвей репозитория.

61. Расскажите о стратегии ветвления.

Практические задания

62. Напишите базовую реализацию std::shared_ptr.

63. Реализуйте алгоритм сортировки.

64. Реализуйте алгоритм хеширования.

65. Реализуйте shared_ptr с расширением для weak_ptr.

66. Реализуйте простейший producer-consumer, используя условные переменные.

67. Опишите как можно подробнее, что происходит в системе, когда приложение делает сетевой запрос.

68. Детально описать дизайн программного компонента, например, системы голосования — учесть при этом высокую нагрузку и сделать его расширяемым и отказоустойчивым.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *