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

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

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

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

    00:00:02 - 00:01:18

  • работал что учил что знаешь 11 14 стандарт сто процентов 17 отчасти всякие вот эти новые фишки по типу any варианты и все остальное подобное стандартная библиотека с шаблонов и стиль также работал с потоками Кто не знает Boost атрибуты скажем так для работы сессию Вот и собственно все хорошо работал с фреморком хьют Хорошо я понял хорошо давай тогда переходите к техническим вопросам В общем Расскажи мне пожалуйста про про оп Расскажи пожалуйста Расскажи про законы и про них подробнее пройдемся это одна из программирования наравне с

    00:00:40 - 00:02:32

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

    00:01:36 - 00:02:59

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

    00:02:20 - 00:03:29

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

    00:02:54 - 00:04:14

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

    00:03:33 - 00:04:58

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

    00:04:16 - 00:05:34

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

    00:05:02 - 00:06:20

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

    00:05:41 - 00:07:12

  • Чуть более глобально без упора на Виртуальность на там перегрузка имеет это статический динамические если так Да это правильно ответ но это то что я хотел услышать хорошо В чём Почему один называется статический другой называется динамический Ну все опять же упирается видимо в этапы сборки программы при если мы собираем нашу программу компилируем то на этапе компиляции здесь решается уже какой метод будет вызван там данной связи а при динамической Мы уже на этапе выполнения программы Сама решает какой метод и какой Какой

    00:06:29 - 00:08:00

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

    00:07:15 - 00:08:37

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

    00:08:01 - 00:09:22

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

    00:08:46 - 00:10:12

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

    00:09:29 - 00:11:04

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

    00:10:23 - 00:11:46

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

    00:11:04 - 00:12:29

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

    00:12:01 - 00:13:27

  • но это Например приватный метод Хорошо давай Окей Мы тут разобрались тут Все правильно давай вынеси ее пожалуйста обратно Я думаю еще найдется один способ который мы могли бы здесь сделать один способ а ну в том случае если мы к примеру унаследуемся от Child сделаем еще один Наследник 3 уровня в котором мы уже используем паблик наследования но у нас все равно B останется протектор и Извне он не будет доступен То есть это паблик но там все равно протектор он протектор внутренний Короче не поменяет

    00:12:52 - 00:14:05

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

    00:13:34 - 00:15:01

  • Ну это не то что я имел виду но Поясни пожалуйста Ну если мы с кастуем наш чайлд указательный набиту принципе это может сработать так смотри мы же получается Здесь у нас и так происходит Каст мы этот Каст нам не будет доступен из-за протектор наследования по сути как бы Каст от наследника базовым он происходит как бы автоматически Да поэтому нам какие-то дополнительные манипуляции по типу там динамика 100 как бы не нужны ну то есть конечно да По идее если мы там например возьмем просто сделаем New Child засунем

    00:14:18 - 00:15:33

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

    00:14:57 - 00:16:19

  • какая у нас может быть конструкция мы можем получать доступ к правит полям функция Все мы можем получается что мы можем сделать здесь мы сделаем вот мы укажем то что функция Check childb будет являться дружественной для нашего класса Child то вот да пока что фишка о том что она не одна вот понял игра в таком случае может вынести ее поверх она скомпилируется и если после по сути ты ее как бы внутри можно сказать что внутри класса происходит такая предварительная декларация вот совсем забыл как-то про этот инструмент

    00:15:44 - 00:17:30

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

    00:16:42 - 00:18:15

  • с помощью оператора вот наш оператор здесь принципе потому что изменять Мы массив наш не планируем И тем более здесь в качестве аргумента тоже был передан пост конст Вот это первый Подожди подожди я тут тебя уже Немного остановлю есть просто ошибочка в том что ты сказал да то что в данной ситуации ты делаешь ИТ это у тебя не итератор будет это будет по сути параметр rangebased for То есть если бы итератор то это был бы там hard.bgar.net это были бы операторы Ну всё продолжай то есть внес поправка

    00:17:31 - 00:18:46

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

    00:18:09 - 00:19:54

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

    00:19:01 - 00:20:25

  • у нас массив не пустой хорошо дальше показывай зачем я завел переменную которая будет хранить пока что значение под нулевым индексом нашего вектора вот так как я уже здесь можем сэкономить одну операцию можем примеру интересно Если я вот так сделаю просто ничего не будет ты просто пытаешься сделать Range based for по интовому значению то есть ничего не будет работать то есть данной ситуации с Range Base как бы Если уж делать то мы предполагаем что у нас весь массив должен быть проитерирован и как бы тут

    00:20:00 - 00:21:15

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

    00:20:43 - 00:22:13

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

    00:21:32 - 00:22:55

  • мы ничего не можем найти Да вот если у нас например максимум И мы передадим туда пустой массив в СТД Макс Что нам вернется Ну мы сказали что Exception это какой-то прям уже сильно радикальный вариант Ну подозревают что может к примеру вернуть ценник Мой адрес вряд ли потому что мы ожидаем значение оттуда вот смотри вот у нас например отойдем в сторону от Макса Да у нас есть например функция stdfight что вот они вернут если они не найдут ничего реализовано основание итераторов Поэтому если значение по нашим первым итератору

    00:22:16 - 00:23:40

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

    00:23:09 - 00:24:48

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

    00:24:03 - 00:25:16

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

    00:24:44 - 00:25:56

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

    00:25:23 - 00:26:46

  • рассказываешь про именно как сама реализация Какие свойства имеет Вот я как бы это сказать Вот смотри что 100% гарантированно у например использованного там Макса или find If Да против например какого-то нашего рукописного поиска что у них есть чего у нас нету ну гарантия того что Всё В любом случае завершится валидно даже если мы перед пустую коллекцию ещё не совсем то то есть но все завершится валидно у нас например тоже все завершится валидно но вот что в нашем коде в чем мы не можем быть Уверены

    00:26:06 - 00:27:19

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

    00:26:42 - 00:27:52

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

    00:27:19 - 00:28:45

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

    00:28:03 - 00:29:15

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

    00:28:42 - 00:30:02

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

    00:29:22 - 00:30:36

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

    00:30:02 - 00:31:26

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

    00:30:46 - 00:32:08

  • сработает Хорошо Ты сам Ну ты же сам сказал про раскрутку про то что два исключения То есть у нас будет одно всё будет хорошо хорошо А давайте Теперь как-то мы вот что какие ситуации ты абстрактные можешь придумать Да вот там в трех в блоке Try да Чтобы произошло ну вызвался я там с тэйт так ну в этом случае он хотя да хорошо Ну примеру деление на 0 самая банальная штука может быть примерно здесь винт б равно 5 равно B делить на 0 вот так но смотри на то есть что ты здесь как бы создал но это ты берешь частный случай Да в данной

    00:31:28 - 00:33:06

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

    00:32:17 - 00:33:40

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

    00:33:08 - 00:34:31

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

    00:33:50 - 00:35:05

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

    00:34:27 - 00:35:44

  • нас Мы выбрасывается исключение у нас начинает происходить раскрутка стека у нас называется деструкторы вот если у нас получается два исключения одновременно тогда мы попадем Да вот здесь у нас создается один объект А да и у него там как-то она бросилась и так далее вот по сути напрямую мы не хотим Ну не бросаем Да потому что я говорю Я по крайней мере моё мнение что это чуть ли не реальная ситуация вот но какая ситуация более реальная чтобы у нас именно в данной ситуации бросилось два исключения

    00:35:08 - 00:36:19

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

    00:35:44 - 00:37:04

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

    00:36:27 - 00:37:52

  • ситуация и эта ситуация которая чаще описывается в документации То есть если у нас если у нас объектов несколько да и у нас во время раскрутки стака сработает сбрасывание исключения тогда как бы и произойдет в целом то что здесь не понял как бы ничего страшного все остальное как бы все отлично рассказал Я совсем как вопрос сейчас я подумаю что дальше можно спросить Расскажи пожалуйста в чем у нас будет принципиальное отличие между классом CD и классом CD 1 так States D1 то что в данном случае при Ну это конструктор

    00:37:10 - 00:38:31

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

    00:38:00 - 00:39:25

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

    00:38:44 - 00:40:01

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

    00:39:38 - 00:40:54

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

    00:40:16 - 00:41:47

  • Old Data на самом деле довольно таки устаревшее понятие по сути после 11 стандарта она делится уже на 2 понятия То есть у нас есть типы из trivial то есть c++ предоставляет проверочные вот эти классы шаблонные типа из тривиа из Standard да то есть это тривиальный тип либо тип стандартного яута это всё завязано на скажем так на какие есть классы Какие нету на доступный дефолтные инициализации доступные ему взаимодействию си Вот и как бы под тип - это получается тот тип данных который в себе совмещает как тривиальность так и

    00:41:04 - 00:42:18

  • стандартные я вот в общем довольно-таки Сложно тут я лучше Например если буду выкладывать или отдельно дам как бы ссылку Да именно на статью где это всё почитать более подробно потому что собеседование в целом это спрашивает что было осознание того что как бы именно конструктор который мы напишем с пустыми скобками это будет кардинально отличаться от конструктора С пометкой дефолт И вообще про вот эти вот под trivial и Standard layout периодически спрашивают на уровне например Junior плюс могут такие вопросы встретиться Вот

    00:41:41 - 00:42:45

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

    00:42:13 - 00:43:38

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

    00:42:55 - 00:44:14

  • код можем закрывать Ну демонстрации отключать смотри Расскажи пожалуйста зачем нам нужна функция Хотя нет еще поспешил вот [музыка] Знакомы ли тебе как бы умные указатели хорошо вот смотри вот у нас есть sharpointer да и у нас есть по сути есть вариант создания как просто скажем так стандартным и создаем экземпляр класса перейдем туда указатель либо у нас есть варианты вызова функции machart зачем нам нужна какие-то кейсы знаешь какие случаи Ты знаешь зачем она нам вообще вот ну зачем она была вообще

    00:43:45 - 00:45:13

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

    00:44:32 - 00:45:58

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

    00:45:30 - 00:47:06

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

    00:46:20 - 00:47:43

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

    00:47:10 - 00:48:26

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

    00:47:56 - 00:49:13

  • что ну как бы неё уже будет создан Да но при этом sharper не произойдет не попадет потому что Funk X у нас произошло исключение это Это первый момент почему как бы то есть но если мы сделаем Make Sharp то все создание произойдет в рамках функции моих шара 3 как бы все будет хорошо само создание указатель и так далее А еще есть один момент по поводу моих шарат Почему В чем есть его преимущество можешь предположить а ну если вот сейчас у меня такая мысль была пришла Возможно эта функция возвращает

    00:48:35 - 00:49:50

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

    00:49:14 - 00:50:35

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

    00:49:54 - 00:51:09

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

    00:50:33 - 00:51:53

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

    00:51:16 - 00:52:45

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

    00:52:06 - 00:53:14

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

    00:52:43 - 00:54:03

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

    00:53:23 - 00:54:35

Менторы

Специалисты своей области, которые смогут помочь вам

  • Нигма Нурия
    Нигма Нурия

    Middle .Net Developer

  • Сущенко Татьяна
    Сущенко Татьяна

    Senior Product Manager

  • Гудков Денис
    Гудков Денис

    Middle Python Developer

  • Курочкин Константин
    Курочкин Константин

    Ведущий программист

  • Гудман Макс
    Гудман Макс

    Backend Software Engineer (PHP)

  • Гребенкин Антон
    Гребенкин Антон

    Senior .NET/C# developer

  • Ахназаров Фёдор
    Ахназаров Фёдор

    Middle DevOps Engineer | Tbilisi, Georgia

  • Шорохов Дмитрий
    Шорохов Дмитрий

    Middle C# .NET

  • Жуков Александр
    Жуков Александр

    Senior PHP-разработчик

  • Мазикин Павел
    Мазикин Павел

    Middle python developer

© 2024 HireGuru. Сделано в Санкт-Петербурге с hireguru.ru