Mock-собеседование С++ разработчика из Яндекс | Самое полное интервью

Подготовка к собеседованию на C/C++ Developer

Транскрипция видео:

  • Привет У меня есть друг Максим Он работает в Яндексе и я его сегодня позвал на мой интервью чтобы позадавать его различные вопросы по всей плюс интервью получилось достаточно оживлённым Поэтому приятного просмотра Максим привет Сегодня у нас МОК интервью по плюсам позадаю тебе ряд вопросов как готов Да привет всё готов Окей погнали давай начнём с Ops И плюс И начнём с такого вопроса вот представим такую ситуацию что я хочу сделать так чтобы объект нельзя было создавать себе Ну допустим я написал какой-то Класс и хочу

    00:00:00 - 00:01:01

  • сделать так чтобы пользователи этого класса не смогли создать объект Так ну самое такая мысль которая первая пришла в голову это допустим сделать фабрику то есть мы делаем некоторую фабрику которую приватным мембером будет ну какой-то определенный Класс вот но чтобы грубо говоря у других объектов не было доступа к его конструктору вот на То есть тут такой момент вот чтобы наш конструктор мог вызывать Ну только сама фабрика Это должно быть к этому классу других пользователей Ну или приватным приватный конструктор

    00:00:30 - 00:01:49

  • сделать самого класса и френдом сделать Да кстати да как вариант а да Можно например переопределить оператор New у Ну у самого класса вот и уже здесь мы можем Ну да переопределить нее Delete тогда уже раз мы переопределяем вот и контролировать Ну да и допустим бросать снова исключение Ну или приватной области или приватная область Окей Хорошо давай еще допустим рассмотрим кейс хочу сделать так чтобы я мог ограничить количество создаваемых объектов допустим я написал какой-то Класс и хочу сделать так чтобы можно

    00:01:15 - 00:02:39

  • было допустим создавать не более 10 экземпляров этого класса или для другого Ну возьмем какой-то класс не более 10 экземпляров хочу сделать так чтобы не было в программе не более 10 экземпляров нужно вызвать конструктор не более 10 раз да то есть да И тут только конструктора еще копирование стоит не забывать при копировании тоже а копировать Да кстати вот да Окей Ну можем допустим ввести в нем подсчет количества референсов например ну или вообще ну такой самый простой вариант но чтобы не усложнять слишком

    00:02:02 - 00:03:23

  • код для пользователей и предоставить простой интерфейс допустим но опять же делаем фабрику вот делаем какой-то класс внутри фабрики делаем приватным конструктор конструктор и да конструктор копирования и обычный конструктор Вот и предоставляем интерфейс от фабрики на создание объекта Вот И там фабрика смотрит допустим и принимает например создавать объект если без фабрики как не сможем это сделать Да но опять же у нас есть New и есть наш конструктор вот тут и конечно будет многопоточный код или нет Давай

    00:02:48 - 00:04:20

  • скажем что мне многопоточный а не многопоточный так хорошо New насколько я помню он у нас статический Да если мы переопределяем для класс Да он статический Да ну тогда на New у нас будет какой-то статический такая статическая переменная отвечающая за счет по счет референсов но сколько мы уже создали вот мы не только в хиппи есть вариант что кто-то захочет и создавать и на стеки или да да Вот я сейчас да как раз хотел об этом сказать Да ну то есть Нам нужно в New и в делите считать так а вот сейчас сейчас конструктор мы можем

    00:03:34 - 00:05:03

  • снять потому что New все равно вызовет конструкцию вызовет конструкторскую переменную заводим как количество и в конструкторе обрабатываем как-то Ну не знаю можем бросить исключение например Хорошо давай еще несколько вопросов точнее А вот допустим есть перегрузка операторов инкремента все префикс и вот как сделать так чтобы и тот и тот перегрузить знаешь особенность нет перегрузки да я помню что там int нужно передать Да теперь только вопрос для кого int для префиксного или после Окей супер и Давайте поговорим допустим

    00:04:24 - 00:05:55

  • есть операторы логического и или Да все плюс и хочу допустим перегрузить их это как думаешь Ну это скорее потому что нам придется учитывать порядок этих операций то есть грубо говоря если у нас есть и то нам нужно учесть такой момент что если допустим слева что-то уже дало отрицательный результат то правую часть мы дальше не вычисляем ты скорее всего имеешь ввиду когда в условиях да что-то Когда в условиях да Ну да то есть собственно именно логика и или в условиях ломается да то есть все верно Окей супер Хорошо

    00:05:22 - 00:06:59

  • давай поговорим тогда просись и плюс плюсы и Допустим мы хотим их подружить примеру У нас есть бинарник плюсовые или либо или наоборотный бинарник или если Плюсовая либо хотим их подружить какие нюансы стоит учитывать при так сказать дружбе этих языков так Ну тут во-первых нужно учитывать что вся нету в некоторых особенностей ну которые уже реализованы в плюсах Ну например там нету ничего связанного с виртуальностью Да вот и это говорит то есть как нужно построить взаимодействие а как нужно устроить взаимодействие

    00:06:14 - 00:07:52

  • Вот тут я уже честно говоря не помню Наверное так сразу скажу Это имеется ввиду не стоит передавать структурки которые полиморфные Да где есть или таблицы виртуальной функции в этом типе содержит потому что как бы ну слишком не знаю что там есть какой-то указать а ну да компиляторы даже происходит встраивание этих этой виртуалки в объект То есть это тоже фишка не будет знать что это окей да еще что стоит воспринимать понимать Так что еще что еще [музыка] что с памятью динамической Да точно так динамическая память у нас

    00:07:01 - 00:08:30

  • то есть вся как мы выделяем как выделяем А да всех мы выделяем молоком вот а в плюсах мы выделяем налог плюс placement New Ну да то есть News поэтому Когда всешку лучше А да точно там окей еще что можно что О чем следует помнить еще чем следует Это насколько я помню это resorting ну имен связанный с добавлением некоторого префикса Ну грубо говоря чтобы у нас функция одним именем правильно реализовывались Да ну то есть а как перегрузка все происходит Просто когда добавляется именно мы все да то есть

    00:08:00 - 00:09:20

  • декорируется да вот фишки есть этот момент или нет а вот и как допустим по-хорошему отключать этот момент когда мы будем предоставлять какой-то интерфейс фишку Как отключить Я думаю это делать собственными компилятора можно пометить насчет опций компилятора не знаю возможно это тоже есть но я не пробовал Окей хорошо еще чем следует помнить еще о чем следует Exception А да Exception так что секс можно так вообще вообще они есть но по моему они есть всех нет А вообще нету Вся она тогда а тогда что мы с ними можем Я бы я бы

    00:08:51 - 00:10:31

  • интерфейсной функции просто забирать ракетчами и на уровне плюсов чтобы все что можно отлавливал пусть даже как бы я бы крашнуться потому что Если слишком полетит это ЛБ будет Exception потому что мы хотя бы там залагируем что у нас какой-то Exception Не преднамеренный но он хотя бы слишком не улетит Да можно сильнее долетела еще давай еще есть последний момент как бы Возможно есть Много мелких самые такие базовые о чем следует помнить глобальных статических переменных А статическое когда они начинают жить и

    00:09:52 - 00:11:06

  • когда они умирать плюс а плюс плюс они сразу Ну вот момент начала работы программы не собственно до входа в дом да до вызова функции умирает когда умирают уже ну после окончания собственно программа после майда и устали что глобальный может не какой-то жир Да у нас быть а глобальный может например быть какой-то объект его аптечка как бы не значащие из конструкторе деструкторы да [музыка] можно допустим попробовать собрать Ну там на самом деле Просто такая рекомендация Что лучше просто делать плюшевый Бинар и тогда

    00:10:32 - 00:12:10

  • вот я тоже об этом подумал есть еще можно перед функцией Main после там вызывать расширение какое-то чтобы это автоматически вызывался кот Как бы мне кажется не так реально Окей супер Хорошо давай поговорим с тобой строках как строки а стройки все плюс плюс насколько я помню это просто некое подобие массива то есть они алоцируются подряд у них идет локация Вот и в принципе но не совсем чем есть особенность строк одна оптимизация используется какая оптимизация Нет не слышал остренько то есть если строчка маленькая можем ее

    00:11:27 - 00:13:08

  • в хип не сохранять можем положить то есть путем юнионов Там просто разместить Но это как бы один из способов то есть строки Все плюс они мутабельные Да какие еще есть способы как мы можем строчки вообще делать Может быть приходилось писать свои строчки или где-нибудь использовать библиотеках как так еще раз вопрос в том чтобы написать свой собственный свой собственный пластик написать первый вариант обсудили это Вектор расширяется какие есть еще варианты То есть нам приходит грубо говоря это менеджер давай писать строку свою будем

    00:12:32 - 00:13:46

  • Ну строку можем сделать допустим на листе на основе ли Вот Но в таком случае нужно помнить о презентации памяти Ну то есть нужно написать будет скорее всего свой локал локатор это будет больше похоже наверно на Дек А что нам надо что нам это даст нанести То есть если мы захотим какие-то постройки вставлять если мы как-то да если мы хотим причем Ну вставку там в центр там можно нормально будет оптимизировать вариант Еще еще допустим если мы не хотим вставлять Ну то есть у нас ну просто они ему табельные и в таком случае мы можем на

    00:13:14 - 00:14:47

  • базе некоторые [музыка] еще еще допустим если мы знаем заранее символы ну которые есть допустим что мы знаем что у нас строчки там не знаю очень мало символов и нам допустим Ну допустим там два символа то можно использовать некоторые методы сжатия допустим для этого ноки если мы хотим экономить память Да но это больше как бы уже оптимизации идут а вот концепцию допустим знаешь допустим Когда в линук семи форкаем процесс чтобы не знаешь Нет не знаю вот там происходит То есть если кто-то начинает менять

    00:14:00 - 00:15:28

  • какую-то страничку она начинает копироваться вот можем копировать сделать настройках если кто-то начинает менять то Ну да скопировали буфер шарится этот буфер только кто-то начнет менять Мы возьмем и скопируем этот буфер себе тоже вариант копия райт строчки сделать Да ну насколько я помню такая концепция что мы не изменяем строку мы просто создаем новый Окей хорошо поэтому возможно допустим Чем отличается выброс исключение от аборта то есть произошло у нас какая-то исключительная ситуация мы можем обработать значит говорят

    00:14:57 - 00:16:29

  • в чем разница ну после аборта мы уже все мы уже ничего не сможем сделать там уже идет завершение программы А если это Exception то мы еще можем с ним собственно говоря поработать Вот и что-то с ним сделать но вот именно Ключевая особенность чем разница деструктор заводится приборте а нет не зовутся вообще не зовутся А когда они могут называться а прицеп не могут не позваться сейчас надо подумать могут не позваться деструкторы А ну если вот я имею ввиду про когда мы кинули исключение и оно пролетает несколько

    00:15:48 - 00:17:21

  • фреймов каждой функции допустим 5 прямой функции пролетела Там же есть грубо говоря автоматические переменные которые будут которые нужно назвать деструкторы я вот этих всех объектов имею ввиду будут звать когда они будут звать инструкторы исключения если не влетела в catchblock если по сути то же самое борт никакие момент прилета в catchblock никогда anwayce исключение пролетает функция тела тогда начинается Окей хорошо давай тогда заговорил про конструкторы чем особенность выброса исключение в конструкторе деструкторе

    00:16:39 - 00:17:56

  • так в конструкторе У нас есть гарантия безопасности то есть грубо говоря если у нас заговорил Какие знаешь гарантий безопасности исключений Ну и в двух словах что каждая гарантия с собой говорит под собой подразумевает вот насколько я помню самая сильная гарантия я не помню название Вот она говорит нам о том что грубо говоря все будет возвращено прежнему состоянию и то есть у нас ну как будто это действие собственно говоря не было это строго гарантия безопасности сути можно описать как атомарность либо

    00:17:26 - 00:18:53

  • так и по моему есть еще слабая базовая базовая Вот Но но вот тут я скажу как бы не будет не будет учить ресурсов как бы все согласованное состояние не будет никаких утечек ресурсов вот Извините но не будет окей давай тогда Вернемся конструктором исключение собирается вылетит из конструктора из инструктора так ну в конструкторе следует помнить что если мы вызываем Ну у нас вылетает то деструктор не будет вызван вот Поэтому собственно говоря допустим если мы лоцировали не знаю через нее допустим и не позвали него

    00:18:14 - 00:19:46

  • делить то собственно это уже наша проблема да да деструктор так днем вообще обычно не бросает исключение когда хорошо Мы решили что нам все можно и начинаем бросать исключение а так тут Честно говоря я наверное не скажу никогда не сталкивался с такими кейсами Ну допустим если брошь исключение смогу я где-то отловить или нет отловить прихватить точнее перехватить У меня есть ощущение что там будет аборт Ну как правило со многими компиляторами Возможно это не стандарте я не сталкивался компилятор явно

    00:19:20 - 00:20:53

  • помещают инструктор вот мы принципе можем написать на except Falls я так чтобы сейчас что стоит учитывать когда вылетает исключение из деструктора Double Exception можно да Ну да если у нас прилетает но второй Exception то там уже зовется аборт да то есть Пока летит первое исключение влетает в catchblock начинается удаляться автоматические перемены туда Black section Да терминает Окей но представим Я хочу все-таки хочу избежать чтобы не было Да было как я могу это проверить а как можно проверить что нет

    00:20:16 - 00:21:27

  • точнее и то есть проверить если сейчас летит это исключение то мы не будем тогда бросать потому что это дабы Если нет то Ну бросим Окей хорошо представим нас много по точное предложение у меня вот в одном потоке вылетело исключение во втором каком-то Ну то есть запустил 10 воркеров У меня какой-то параллельный алгоритм И проверить все ли корректно завершились но я просто хочу вылетела где-то исключение в одном из оркеров или нет Как это можно достичь Ну тут можно поработать Ну или с другими объектами которые умеют

    00:21:09 - 00:22:37

  • работать с возвращением результатом и вот и собственно Да уже при получении этого результата мы можем посмотреть через интерфейс Был ли какой-то Давайте сохраним Как при помощи чего знаешь нет при помощи Чего Это сохраняется при помощи чего Ну можно допустим через отдельный инсус просто какой-то будет который не используешь и принципе можем сделать сеток а фьючерпим просто вылетит и мы при помощи его перехватим Окей супер Давай поговорим про умный указатели Какие Знаешь какими хотел бы чтобы ты рассказал подробнее как каждый

    00:21:52 - 00:23:23

  • из них работает какие есть нюансы Так ну рассмотрим наверное только такие самые базовые указатели это Давай в двух словах как каждый из них работает удалять когда у него нулевой вот какой подсчет ссылок Там просто там идет подсчет количество объектов между которыми на собственно шарится этот ПТР Вот и когда нуль Ну то есть грубо говоря в конструкторе плюс один просто я не потому что ни один счетчик ссылок А их 2 Но для них для и тут зависит того как мы его создаем если мы создаем через мы удаляемся когда

    00:22:42 - 00:24:19

  • супер да Окей так Unic Pointer Unic Pointer Ну у нас там есть только мув конструкции Ну то есть он может принадлежать только одному объект собственно с ним работаем И когда зовется его деструктор мы собственно и далее Что там такое там хранятся директор еще внутри умных показателей знаешь зачем они используются нет литр и так полагаю что допустим это логика Когда нужно допустим очистить если мы хотим не память освобождать файл закрывать можно написать Мы хотим написать умный указатели и хотим сделать так чтобы он корректно

    00:23:37 - 00:25:11

  • работал как для одного какого-то объекта единично как это можно при помощи есть Так давай давай еще раз вопрос мне кажется не до конца мы пишем на указатели хотим сделать так чтобы можно было он корректно отрабатывал когда мы зовем New int также хотим корректно Ну то есть для неё там и просто позовем Delete А вот для int массив 10 Нам нужно будет правильно Да вот как мы этот кейс можем обработать если мы пишем а ну во-первых мы можем сделать его через шаблоны и через шаблоны через иконспекспорт обрабатывать

    00:24:39 - 00:26:14

  • Ну можно да То есть можно явно специализировать просто для массива надо Окей окей супер и Давай еще рассмотрим такой кейс хочу сделать так чтобы указать текли то чтобы там были утечки свои конечно свои можно написать что будет все что угодно течь Да возьмем на указатель хотим сделать так чтобы шарик смог память и в униках Окей так шара А ну в sharedit допустим самый простой кейс когда они друг на друга ссылаются Да вот и тогда когда выйдем из блока у них не позовутся инструкторы Давай посмотрим как можем

    00:25:32 - 00:26:46

  • сделать так чтобы там так юник а но такой тоже кейс но тут больше Наверное он связан не с самим допустим у нас есть и Б наследуется от А вот и при этом у нас допустим инструктор не виртуальный Вот и тогда у нас Когда мы будем выходить но собственно у нас объекта позовется Ну только деструктор б вот ну хотя он был А ну это не совсем то есть я просто имею ввиду когда у нас есть вот объект Это просто для него делить не позовете когда для него просто А ну например сейчас допустим у нас есть функция функция

    00:26:12 - 00:27:46

  • и один из методов у нас пусть будет бросать исключение Ну то есть у нас есть функция и один из аргументов Ну собственно другая функция Передаем вот и он бросает исключение и есть допустим этот и мы Передаем еще одним аргументом но собственно наш и не ПТР Вот и делаем его через Make shared А через New и теперь да ну то есть из-за того что у нас не определено В каком порядке У нас должны вызываться аргументов то может получиться Так что мы выделяем память потом бросаем исключение Ну давай еще вопрос вот допустим

    00:27:02 - 00:28:25

  • представим Я у меня есть класс А вот эту память которая То есть как работает и он сначала выделит память а потом позовет малок в конструкторе вылетело исключение это утечка или нет Так подожди а на каком моменте класс так так делаю Я зову а New A вызывая А в Конструктор [музыка] а просто нет Мы не успели спровоцировать Как работает локации памяти потом логично безопасность которая нам скажет что все будет нормально Вот я имел ввиду что мы не успели провоцировать но ничего внутри этого класса допустим что у нас есть конструктор у

    00:27:47 - 00:29:39

  • нас перед тем как вызвать исключение Да окей супер Давай поговорим про контейнеры немного поговорим про маппа норда лет чем их разница Так нуб построен на Хеш функции вот на вот тут вот есть две насколько я помню реализации одна на Красном черном дереве а вторая на vl3 четко не регламентирован какое дерево Ну чаще всего красно-черные встречаются Да думают это имелось ввиду еще при разнице просимптотическую сложность разных операций вот тут стоит сказать что в обычной Мафия у нас вставка логарифм поиск логарифм Вот

    00:29:03 - 00:30:52

  • Но если это Ну конечно это зависит от типа дерева но будем говорить про бинарное дерево хотя на самом деле там Ну всегда принципе будет зависеть его степень от того какое дерево вообще в принципе если она не сбалансирует линия будет в этом случае это да это само собой Я говорил скорее про то сколько у него потом То есть это не бинарное так дальше сказал да А теперь но тут вот всё уже сложнее тут конечно но нам все говорится что делается все это за константу Вот Но тут Они конечно лукавят Тут все ну так

    00:30:04 - 00:31:24

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

    00:30:56 - 00:32:18

  • один уникальный либо там если это то мы будем идти Ну и прям честно сравнивать все объекты которые там А там уже может не накопиться Да ну и вставка амортизированная ставка еще получается за счет то что надо индексировать Окей и Давай еще рассмотрим такой случай хочу в качестве хочу тоже написать свой Классик и использовать в качестве ключа для мап и для номера как это можно достичь просто и Да окей ладно супер у меня принципе просто больше нет Если у тебя какие-то вопросы нет вопросов не осталось хорошо

    00:31:39 - 00:32:57

  • тогда Спасибо за интервью Я думаю получилось достаточно Круто все дать Я тоже

    00:32:23 - 00:32:34