Спасибо большое полезный контент. Изучаю программирование достаточно долго, хоть я и новичек. Сделал вывод, что среди всех, лучше всего учиться у тебя. Удачи, пили еще контента. Каждое видео обожаю
Вы только представьте, сколько людей, благодаря вам написали лабы, сдали зачеты, написали экзамен, закрыли сессию.. С ума сойти, огромнейшая благодарность.
Урок довольно сложный и длинный, на запись и монтаж потратил 3 часа. Но конструктор копирования один из важнейших моментов в ООП, так что надеюсь всё не зря. Всем настойчивости в обучении! =)
Было бы хорошо, если бы Вы выложили исходный код в группе в ВК, так как после просмотра Вашего видео полезно реализовать даже идентичный код, то есть по памяти написать такой же и всё хорошенько усвоить, так как урок действительно не с лёгких. Мое мнение как новичка! СПАСИБО ЗА УРОК!
Pluto, да просто чз присваивание копировать. на видео, обрати внимание на статическую переменную int Size, которую объявили в 140 сроке, дак вот копирование этой переменной организовано в "конструкторе копирования" в 121 строке: this->Size = other.Size;. Ну, а если в твоем классе динамические переменные вообще отсутствуют, и ты пользуешь только статические - тогда тебе подойдет "стандартный" конструктор копирования объектов. т.е., самому перегружать этот конструктор тебе в принципе смысла нет,
@@СергейКравченко-щ6р Я бы вам рекомендовал просмотреть видео несколько раз, ПОНЯТЬ смысл, и реализовать такой конструктор самому, так как это будет лучшим способом написания кода, а не его копированием. успехов
24 год, 3 октября, двенадцать ночи. А я сижу и смотрю семилетней давности видео, потому что не повезло с преподами. И что бы я без Вас делала? Спасибо большое, за то, что Вы есть! Всего Вам самого лучшего!
Мой фарш в голове согласился принять это только с 4-го раза!! Хоть и тема трудноватая, но вы обладаете крутейшими преподавательскими способностями!!!! Спасибо, Сергей!!!!
Спасибо огромное! Учусь в академии на программиста. Ваш канал посоветовала всем одногруппникам. Многие из них стали смотреть Ваши уроки. Недавно один из одногруппников сказал мне:"Забил на все и сутки смотрел SimpleCode, не мог оторваться". Как дополнительный материал Ваш канал просто бесценен!!!
Скорее всего : Дополнительный материал, это то, что - "Учусь в академии на программиста", к тем урокам которые преподаёт Сергей? Вы наверное так хотели выразится? XD)))
Это просто самый лучший преподаватель, которого я встречал в своей жизни, так, как Вы обьясняете, не обьясняет никто. Посмотрел пару раз заново видео, было все равно непонятно, на 5 раз я понял как это элементарно и гениально, будто что-то щелкнуло в голове. Я обязательно часть первой зарплаты с работы в IT отправлю Вам. Спасибо большое!! Огромное, человеческое спасибо!!!
получается алгоритм такой: в паблике класса два конструктора для одного класса: MyClass(int size) и MyClass(const MyClass &other) После старта программы сначала создается объект MyClass a(10) и отрабатывает первый конструктор MyClass(int size) при этом: 1) создается указатель на ячейки памяти *data. Из прошлых уроков такой указатель может также будет указателем на начало массива data[] объекта а. 2) скрытой переменной Size объекта присваивается значение size=10 3) массиву data[] устанавливается динамический размер =10 4) массив циклом заполняется значениями от нуля до девятки 5) выводится на экран сообщение "Вызвался конструктор" далее в main переходим ко второму объекту класса MyClass b(a) и отрабатывает уже второй конструктор MyClass(const MyClass &other): 1) скрытой переменной Size объекта b присваивается значение size, такое же как у объекта а 2) создается указатель *data и выделяется память для нового объекта b или иначе для нового массива data[] объекта b. 3) через цикл в каждую ячейку массива объекта b копируются значения массива объекта а 4) вызывается сообщение "Вызвался конструктор копирования" получается два одинаковых объекта с разными адресами памяти. далее вызывается деструктор для второго объекта и потом для первого. Это гениально просто! Получается, что применяется своеобразная перегрузка конструкторов. Однако на данном этапе не понятна практическая ценность этого, она расскрывается в следующем уроке.
Я только не понял если у нас скрытой переменной Size объекта b присваивается значение скрытой переменной Size объекта a, то зачем в данной строчке кода: this->data = new int[other.Size] и данной строчке кода: for (int i(0); i < other.Size; i++); писать размер массива other.Size а не просто Size? Ведь скрытая переменная нового объекта b уже хранит в себе значение скрытой переменной Size объекта a.
@@sheldon3705, а какая разница? В данном случае ничего же не меняется. Что мы напишем "this->data = new int[other.Size], что просто this-> data = new int [Size], результат будет одним и тем же
@@sheldon3705 Люди учатся по разным учебникам курсам и т.д к примеру он нас учит делать код кто-то повторяем его манеру а кто-то нет,в програмирование как в картинной галереи кто-то считает эту картину красивой и делает похожее на нее а кто-то другую тоже с other.Size и Size кто как хочет так и пишет , а стандарты нужны лишь для того чтобы все понимали код. ЕСЛИ В КРАТЦЕ ТО КТО-ТО ПИШЕТ other.Size А КТО ТО ПРОСТО Size P.s Отпишитесь если меня не поняли P.p.s Ах да читаете иностранные форумы там тоже есть много похожих вопросов
Понял с первого раза, новичков может сильно спутать пример применения Кк. Вот, кто сразу не понял, постарался вычленить суть: Конструктор копирования - конструктор, реализуемый по умолчанию, и вызываемый при копировании объекта класса(передача параметром переменной типа класс). Его особенность в том, что он делает абсолютно идентичную копию объекта побитово. Это может создать проблему в том случае, когда в описании класса мы реализуем динамический массив. В таком случае, при копировании экземпляра класса, динамический массив тоже скопируется, а также и адрес его указателя. Иначе говоря, два указателя будут хранить один и тотже адрес, и когда мы попытаемся реализовать оператор delete[] в деструкторе, он попытается дважды очистить одно и тоже место в оперативной памяти, что и вызовет ошибку. Синтаксис: class Human { public: Human(const Human &other) //передача параметром объекта типа класс, разумеется, по ссылке { } };
Выскажусь по поводу всего курса. Канал - шикарный. Подача материала - просто о сложном.Без воды, все по делу.Хотелось бы, в Вашем изложении, разобраться с конструкторами переноса и, в целом, с "move semantics".Спасибо за Ваш труд.
спасибо тебе хороший и умный человек за твои уроки, если бы не ты, не знаю как бы в этом всем разбирался, комменты никогда не пишу, но уроки настолько хорошие, что нельзя не поблагодарить, здоровья тебе и твоим близким!
После первого просмотра понял что тема совсем непростая, пришлось откатится назад к уроку по копированию данных из массива в массив. Хотелось бы больше практических занятий по данным урокам, это как пожелание. . Ещё раз спасибо за уроки.
Самое сложное в программировании - это понять нахй это может пригодиться, так освоить было бы легче) Но определенно это лучшие лекции, вам в университете преподавать
Не совсем согласен. Иногда достаточно поверить преподавателю, что это важно, и лучше это сразу усвоить. Но соглашусь, что с примером, как применять, обычно изучать что-то новое приятнее и легче.
Спасибо вам большое за урок, как всегда. Очень сложная тема, но вы как всегда всё детально объяснили, и я даже умудрился всё понять! Ещё раз, огромнейшее вам спасибо за труд
Помню смотрел твои видосы, когда у тебя еще были лишь сотни просмотров) Вот сейчас пересматриваю, т.к. через месяц гос. экзамен, и нужно всё повторить) Спасибо за твой труд!
Что происходит,что происходит....Уже не понимаю ,что происходит,как только закончилось процедурное программирование и началось объектно-ориентированное))))
Главное не сдаваться и "грызть"! Не получается - ляг отдохни, а потом запускай плуги глубже - по предложению, отдельному слову... Смысл в том, что данный урок аккумулирует в себе знания и терминологию предыдущих уроков. Твои знания еще не достаточно сжаты в "оперативке", чтобы свободно ими оперировать образно-виртуально и ты не успеваешь за логикой подачи информации - лист бумаги, код - рисуй и делай свою "область тьмы" светлой! Сергей - киберхристос - такие знания за какой-то лайк)))
@@Heart_of_the_world_1985 "По отдельному слову" реально работает. Когда понимаешь каждое отдельное слово, нетрудно понять смысл предложения. А потом эти предложения вместе собираются во вполне осмысленный текст.
2 года назад начал с ваших уроков, сейчас уже работаю программистом, с тех пор познакомился с Си, Rust, Python. Сейчас снова нужно было начинать писать на с++, возвращаюсь иногда к урокам, чтобы освежить некоторые моменты и понастальгировать:) Спасибо огромное!
а как вы учились и потом вот запоминали это все ? может смотрели еще что то кроме этих уроков ? когда учились здесь или вообще как вы осваивали язык когда начинали учиться ?
@@By_B0SS начинал с этих уроков, потом переключился на написание шейдеров, помимо этого еще кучу разных видосов смотрел, повторял, что делают ,пытялся сам разобраться. Купил курс в универе по питону, его прошел чисто по приколу. Алгоритмы и с труктуры данных наше все и куча практики. И я всё равно еще лошара, так что да, это нелегко
Поставил на паузу на 5:08, пишу. При передаче параметра по значению, внутри функции создаётся локальная копия переменной (того типа, который указан в списке принимаемых параметров). Из памяти - честно, как и просили :) Сегодня сложный, но достаточно хорошо разжеванный урок. Спасибо за работу!
я конечно не гений и никогда себя таковым не считал но чего сложного то? перед просмотром ролика аж на пол часа решил глянуть комменты мол "ёмана щито происходит" подумал блин походу будет сложно посмотрел на одном дыхании и вообще не выкупил где же cyko это сложно то?
Долго держался, но вынужден признать - преп и его уроки гениальны!!! Другим далеко в объяснении подобных сложных вещей!!! Благодарю, и успехов и процветания !!!
Сергей! Спасибо Вам за проделанную работу ! Вьехал в тему только наверное с 7 раза . в учебниках рассказывают про конструктор копирования очень размыто. (искал в 5 книжках). Если устроюсь в сфере IT, то свою первую зарплату - отправлю в помощь Вашему каналу !!!!
Спасибо Серега , за 3 захода все понял досконально, все разложилось в голове по полочкам на третий раз просмотра )). Спасибо еще раз от души. По книги это можно неделю изучать )))
Для тех, кто не понял: в случае, когда мы имеем дело с динамическим массивом (а не просто с какой-нибудь переменной), конструктор копирования по умолчанию копирует поля объектов (неглубоко), т.е. указателю на массив нового объекта присвоится адрес массива скопированного объекта, а фактически мы будем иметь один и тот же массив. В таком случае у нас после выхода из области видимости функции будет вызываться деструктор для обоих объектов, но очищать память они , что приведет к ошибке. Чтобы этого избежать, нам нужно написать конструктор копирования (глубокого) такой, что копироваться будет не указатель на один и тот же массив, а создаваться новый массив со скопированными из него элементами, тогда деструктор скопированного объекта будет удалять "свой" массив.
Автор, это лучший курс русском ютубе по программированию в принципе, даже если рассматривать другие языки. Огромное тебе спасибо за то, что ты объясняешь всё, что под "капотом" происходит. Именно то, что я искал. Можешь посоветовать какие нибудь книги, чтобы лучше понять процессы, которые происходят на низком уровне, вроде работы памяти, garbage colector'a и тд. Не именно в плюсах, а вообще в целом при программировании
Огромное спасибо за столь качественный материал, Сергей! С первого раза не зашло, только после нескольких просмотров мой разум прозрел и я понял, что здесь к чему :) Главное - долбить в одну точку и не останавливаться и тогда точно всё получится!)
Из выше сказанных уроков все было относительно понятно, при написании кода. По этот урок!!! Суть понятна, написать такое копирование сложно. Буду пересматривать. Спасибо Сергею за такие уроки.
Очень хорошо рассказано, если вам не понятно, то значит вы что-то упустили в предыдущих уроках или не достаточно практики в плане выделения динамической памяти или в понимании создания дубликатов в функциях при передачи параметров по значению
Работаю в студио 2022 и на этапе, когда создаем функцию Foo2(), у меня нет второго вызова деструктора, синтаксис абсолютно одинаковый, но при этом. при прохождении return temp; он не заходит в деструктор еще раз.
Это гениально. Настолько детальный сложный разбор и ты реально смог это объяснить. Спасибо большое! Было сложно. Прервался на третьей итерации просмотра=)
Ну что сказать? Посмотрел первый раз - кое-что стало ясно, до далеко не все. Очевидно надо еще раз или два посмотреть. Тема действительно не очень простая. Очень очень жаль что нет заданий которые могли бы хоть как-то закрепить материал. Пытаюсь вспомнить что, и зачем я изучал в районе 40-х или 50-х уроков и ничего толком не помню. Хотя бы 100-200 задачек бы на этот курс , был бы от курса совсем другой прок. Ну огромнейшая благодарность автору! Зачем мне все эти знания я и сам не знаю, но учиться по этому курсу-большое удовольствие.
Фух. С 4-го раза понял. Оказывается все было очень просто... Спасибо за годный видос, однозначно лайк!) Если кому поможет - this для каждого индивидуален, так как в параметре функции мы вводим новую переменную как ссылку, то имеем право пользоваться данными класса, который был отправлен в параметр функции...
Сергей, посоветуйте литература по С++, по каким книгам Вы изучали язык? А еще можете рассказать как пользоваться отладчиком? я вижу, что справа появляется доп. панель (загрузка ЦП и т.д.)
5:07 -когда передается по значению, это значит в теле функции создается локальная переменная, с которой мы делаем что захотим, но при выходе из тела функции, эта переменная будет удалена. Тогда в main мы не увидим изменений у той переменной, которую передали в функцию.
Немного пояснений. Конструктор копирования - это тот же самый обыкновенный конструктор, который срабатывает при создании обьекта. Но благодаря перегрузке срабатывает код конструктора который принимает в качестве параметра объект.
Спасибо за урок, каждый раз смотрю до тех пор пока не станет тяжело соображать, в этот раз остановился на этом уроке)) завтра с него и дальше) огромная благодарность, это лучший курс в рутубе!
28:31 Для чего тут мы используем this->date=new int [other.Size] ; ?? Нельзя ли просто написать this->data= new int [ this->Size] ? Или this->data= new int [ Size] ? Ведь мы уже выше в коде скопировали this->Size = other.Size
При передаче объекта класса MyClass в функцию Foo по значению в ней будет создан еще один такой же объект, но с одним отличием вместо данных он будет содержать указатели на данные первого объекта.Таким образом на момент работы функции Foo мы будем иметь два объекта которые указывают на одни и те же данные. С окончанием работы функции Foo отработаем деструктор локального (второго) объекта уничтожив как сам объект, так и данные на которые он ссылается. Далее с окончанием работы функции main() будет вызван деструктор первого объекта и при попытке уничтожить не существующие данные по уже битому к тому времени указателю на данные мы получим исключительную ситуацию (вылет).
В зависимости от параматра функция или метода , функция либо копирует аргумент и уже тело функции работает с копией аргумента, или же если параметр єто указатель, тогда функция работает непосредственно с самим обьектом.
При передаче по значению значение переменной из другой функции будет лишь передано свежесозданной функции исключая таким образом изменение данных в оригинальной переменной.
Передача параметра по значению это когда создается копия этого значения, передача параметра по указателю это когда передается указатель (адрес памяти) и этот указатель может указывать на какое-то значение, а передача параметра по ссылке, это так же передача параметра по адресу памяти, который ссылается на какое-то значение (массив, переменную), но в отличие от указателя, не требуется операция разыменования. И еще очень важный момент отличия ссылки и указателя: указатель это самостоятельный объект, который может быть инициализирован без явного указания того, что в нем лежит. Ссылка же, наоборот, не самостоятельный объект, который не может быть инициализирован без явного указания того, что в нем лежит, однако может быть инициализирован, если туда положить какую-то переменную.
Поставил на паузу и понял что я ошибся после просмотра 34 видео . Попутал все . Но спасибо постараемся запомнить. Уверенн что еще буду пересматривать много раз ваши видео .
Отличный урок! Спасибо Вам! У меня вопрос. В конструктор копирования снесла ключевое слово this и получила: Size = other.Size; data = new int[other.Size]; for (int i = 0; i < other.Size; i++) { data[i] = other.data[i]; } Код отработал также, как и с this. Т.е. можно и пускать это ключевое слово?
получается, что после строки this->Size = other.Size; дальше можно вместо other.Size писать Size (при указании размера массива и при указании кол-ва итераций цикла)
5:00 Переменная value типа Myclass будет видна только в области видимости void Foo и не повлияет на другие переменные. Upd: не совсем верно написал) - на эту переменную value никак нельзя будет повлиять из другого места программы, кроме как в этой функции Foo.