Перегрузка операторов пример. ООП. Перегрузка оператора присваивания. C++ Для начинающих. Урок#83

แชร์
ฝัง
  • เผยแพร่เมื่อ 19 ธ.ค. 2024

ความคิดเห็น • 299

  • @SimpleCodeIT
    @SimpleCodeIT  7 ปีที่แล้ว +73

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

    • @eninyri
      @eninyri 5 ปีที่แล้ว

      привет. только ты не рассказал почему вызывается конструктор копирования после команды return *this ! давай раз уже начал!

    • @mukhavertolet
      @mukhavertolet 4 ปีที่แล้ว +4

      @@eninyri никакой там конструктор копирования не вызывается

    • @daclicker
      @daclicker 3 ปีที่แล้ว

      подскажите пожалуйста, где уроки с 63 по 83? Вы в 83 уже по полной в ООП углубляетесь, а на 63 только подбирались. Думал я дурак, но все обыскал и не нашел(

    • @ИгорьК-т1ш
      @ИгорьК-т1ш 3 ปีที่แล้ว +1

      Чувствую, нужно покупать вентилятор по мощнее, мой мозг перегрелся)) Возврат ссылки на объект меня просто убил, пытаюсь переварить этот урок))

    • @777noob777saibot
      @777noob777saibot 3 ปีที่แล้ว +2

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

  • @ИванГончаренко-п2н
    @ИванГончаренко-п2н 7 ปีที่แล้ว +425

    1:15 "А" равно, ну к примеру, 5.
    а=2

    • @fenikdolgouhiy4624
      @fenikdolgouhiy4624 6 ปีที่แล้ว +50

      Иван Гончаренко И так по жизни. А потом ищешь что не работает :D

    • @adiletastana2781
      @adiletastana2781 6 ปีที่แล้ว +23

      Ну ошибся человек, с кем не бывает. Тем более это обычная интовая переменная.

    • @dmytrolytvynenko6537
      @dmytrolytvynenko6537 5 ปีที่แล้ว +16

      @@adiletastana2781 однажды из-за одного бита, не байта, а бита, случилось авиакрушение

    • @АртемНезабудкин-п1г
      @АртемНезабудкин-п1г 4 ปีที่แล้ว +37

      @@dmytrolytvynenko6537 вашего пукана?)

    • @КалпакчиАртем
      @КалпакчиАртем 4 ปีที่แล้ว +2

      @@АртемНезабудкин-п1г авиа

  • @LenTos1337
    @LenTos1337 6 ปีที่แล้ว +291

    Как всегда спасибо за уроки. Для тех кто не понял фишку с тем, зачем нужно возвращать ссылку на объект. Уравнение с = b = a в оригинале выглядит так:
    c.operator=(b.operator=(a)); то есть, сначала в объект b мы присваиваем объект a, и чтобы мы могли присвоить сразу же в объект c наш объект b, наша функция присваивания a в b должна вернуть ссылку на этот объект b, потому что оператор присваивания c не может работать с функцией оператора присваивания a в b, если эта функция не возвращает необходимую ссылку на объект b. Сам пытался додуматься очень долго, для тех, кто не понял, попробуйте прочитать моё объяснение, может поймете лучше.

    • @theos1489
      @theos1489 6 ปีที่แล้ว +28

      Ну да всё так. Оператор = принимает ссылку на объект, а возвращает void, а надо чтобы возвращал тоже ссылку на такой же объект. На самом деле вернуть надо не ссылку, а объект или объект по ссылке.

    • @ЯЗдесь-ъ5ф
      @ЯЗдесь-ъ5ф 6 ปีที่แล้ว +9

      Спасибо!, теперь понял более подробно.

    • @doge8633
      @doge8633 5 ปีที่แล้ว +10

      Может я тупой, но я не понял. Много букаф

    • @DenisBilurka
      @DenisBilurka 5 ปีที่แล้ว +3

      @@doge8633 Жиза

    • @alexandrprodan8794
      @alexandrprodan8794 4 ปีที่แล้ว +11

      Слава Богу, заглянул в комменты, а то еще бы день провозился.Спасибо!

  • @lennoxmacduff2037
    @lennoxmacduff2037 6 ปีที่แล้ว +115

    Потрясающие уроки
    Жонглировать объектами и конструкторами гораздо сложнее чем в java
    Но, чёрт возьми, это же ОФИГЕННО
    Чём больше язык предоставляет способов прострелить себе ногу - тем он круче и мощнее

    • @vitusink6445
      @vitusink6445 5 ปีที่แล้ว +17

      Тебе хорошо зайдет ассемблер :)
      Резвись наслаждайся :)
      А понимаю почему люди придумывают все более высокие по уровню языки...

  • @sabatr1989
    @sabatr1989 7 ปีที่แล้ว +91

    то чувство теплоты в черепной коробке, свидетельствующей о перегреве мозга...но снова на третий раз "зашло всё" до каждого символа! Спасибо.

    • @nurbolatnurguatov2407
      @nurbolatnurguatov2407 6 ปีที่แล้ว +17

      Artem Kuleshov ты меня смотивировал я думал я один такой с первого раза не вьезжаю мол значит не мое это и я туп, думал на 82 83 остановиться бросить, думал у всех идет по маслу, один урок за др, оказ надо пересмотреть, если не 2раза так еще, значит я один из вас, попробую заново

    • @Wardriving666
      @Wardriving666 5 ปีที่แล้ว +1

      @@nurbolatnurguatov2407 Ты не один такой=)

    • @vitusink6445
      @vitusink6445 5 ปีที่แล้ว +2

      @@Wardriving666 Конечно не один, Сережа мощно буксанул с обьяснениями как только добрался до чего то сложного.
      Любитель, что вы хотите?! Но хорошо что хоть такой есть. Часто любитель работает лучше не мотивированного профессионала

    • @aleksandrdrobyshev7623
      @aleksandrdrobyshev7623 4 ปีที่แล้ว

      @@nurbolatnurguatov2407 До какого урока дошел, или прошел все? Я не однократно сдавался на каком-то этапе, теряя нить понимания.

  • @Jessica_Cat-l1v
    @Jessica_Cat-l1v 10 หลายเดือนก่อน +5

    до какого-то момента мне удавалось проходить и усваивать 2-3 урока за день, а теперь трешак начался -
    на 82 урок почти 3 дня🤯🤯🤯, но я пока не сдаюсь. Огромная благодарность Сергею, что может донести инфу даже такому тугодуму - как я😎

  • @borisshalabanov4620
    @borisshalabanov4620 7 ปีที่แล้ว +106

    ты просто машина, я тут как улитка сижу и въежаю,
    спасибо за уроки

  • @MetaLMaDneSS1
    @MetaLMaDneSS1 6 ปีที่แล้ว +104

    только Бьёрн Страуструп понял этот урок ))

  • @Magomedrasul7
    @Magomedrasul7 6 ปีที่แล้ว +61

    Было тяжко понять урок, бросил все, пошел гулять, чуть позже вернулся, посмотрел и понял все )). Чем дальше тем сложнее, так кажется, на самом деле иногда надо просто отвлечься/отдохнуть.

    • @Kokurorokuko
      @Kokurorokuko 5 ปีที่แล้ว

      да, согласен

    • @George_Ryazantsev
      @George_Ryazantsev 3 ปีที่แล้ว

      спасибо, согласен полностю

    • @movich9161
      @movich9161 2 ปีที่แล้ว +13

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

    • @ЛеонидБулгаков-е2т
      @ЛеонидБулгаков-е2т ปีที่แล้ว

      мне это далось гораздо легче конструктора копирования

    • @urrbanskiy
      @urrbanskiy 10 หลายเดือนก่อน

      отдых - тоже часть работы

  • @whhhhitee
    @whhhhitee 6 ปีที่แล้ว +81

    Все видео более информативные и понятные, чем наши лекции в университете. Большое спасибо!

  • @AV1ch
    @AV1ch 4 ปีที่แล้ว +24

    Тут в начале, на 3:00, есть большая неточность.
    Автор говорит «объект А будет думать, что он объект Б». (по описанию похоже на работу указателей, и это запутывает)
    Правильно: ОТДЕЛЬНЫЕ ПОЛЯ в объекте А, которые являются указателями, получат те же адреса которые в этих же полях-указателях в объекте Б.
    Объекты классов - это самостоятельные единицы, у каждого объекта свои поля. Не может быть один объект порван между двумя разными переменными. Бывают &ссылки , но ссылка - это дополнительное имя переменной, а не собственно переменная.
    Если присвоить один объект другому:
    а = б; //и если они одного класса
    , то
    1) указатели в «а» получат те же адреса, что указатели в «б»
    2) остальные поля в «а» получат те же значения, что эти же поля в «б»
    По причине 1) вот здесь 4:52 показываются одинаковые адреса. Среда показывает адрес указателя *data , который содержится в каждом объекте. (Почему показывается именно он? Потому что он - самый первый в каждом объекте. Среда берёт ближайшее к началу поле в объекте, и в данном случае это поле - указатель *data.)
    Это называют «поверхностное копирование» (shallow copy), то есть когда оператор присваивания или конструктор копирования даёт указателям адрес на ту же память, что и в исходном объекте. В Си++ в классах оператор присваивания и конструктор копирования по умолчанию работают так (если их не переопределить).
    «Глубокое копирование» (deep copy) - это когда оператор присваивания или конструктор копирования выделяет новую память. То есть если в исходном объекте есть указатель на память, выделенную через "new", то оператор присваивания или конструктор копирования выделяет новую память для указателя в том объекте, куда копируются данные из исходного объекта.

    • @Tolyan97kartofan
      @Tolyan97kartofan 2 ปีที่แล้ว

      Спасибо, что расписал это, братан! Тоже смутило это, уже собирался проект собирать свой и проверять

    • @ИгроманРоман-н2ш
      @ИгроманРоман-н2ш 2 ปีที่แล้ว

      спасибо а то и вправду запутало

    • @gfhitdxaahn
      @gfhitdxaahn 2 ปีที่แล้ว +4

      Да храни тебя араб в подвале! Выручил

    • @misha2993
      @misha2993 ปีที่แล้ว

      Нихрена не понял, но понял, что автор что-то напутал

    • @AV1ch
      @AV1ch ปีที่แล้ว +1

      @@misha2993 Другими словами.
      Автор говорит «объект А будет думать, что он объект Б».
      Правильно: ОТДЕЛЬНЫЕ ПОЛЯ в объекте А, которые являются указателями, получат те же адреса которые в этих же полях в объекте Б.

  • @VolodymyrChe
    @VolodymyrChe 3 ปีที่แล้ว +6

    Все бы препады так же доходчиво объясняли! На паре часто фиг поймёшь, что зачем и почему. После твоих уроков, всё расставляется по полочкам!

  • @igorfrolov6246
    @igorfrolov6246 2 ปีที่แล้ว +4

    Спасибо тебе! Годы идут, а материал по-прежнему очень полезен, нигде не встречал более понятного объяснения!!!

  • @ВиталийСусский-я2м
    @ВиталийСусский-я2м 3 ปีที่แล้ว +4

    у нас в универе этот материал неделю объясняют и то супер коряво и большинство просто зубрят не понимая что делают, здесь хватило 2 раза пересмотреть и вроде бы понятно все. огромное спасибо за труды, интернет будет тебя помнить долго!

  • @lexcarpenter69
    @lexcarpenter69 3 ปีที่แล้ว +5

    Это такое удовольствие понимать, что происходит. Спасибо за уроки

  • @АлександрХардин-в2н
    @АлександрХардин-в2н 7 ปีที่แล้ว +10

    Большое спасибо за уроки! Все на высшем уровне.

  • @vnaqr
    @vnaqr 6 ปีที่แล้ว +17

    a равно, к примеру 5. а = 2. Лайк однозначно)))

  • @maksimshekhunov4079
    @maksimshekhunov4079 7 ปีที่แล้ว +19

    Спасибо, что ты есть

  • @nap0le0nb0naparte7
    @nap0le0nb0naparte7 7 ปีที่แล้ว +28

    немного сложно,но интересно! Спасибо за урок!!!

  • @ivan100kg
    @ivan100kg 4 ปีที่แล้ว +2

    Спасибо за разъяснение отличий конструктора копирования и оператора присваивания!

  • @flepjack
    @flepjack 3 ปีที่แล้ว +3

    Как ни странно, понял с первого раза) спасибо за предыдущий урок)

  • @nightgames3158
    @nightgames3158 3 ปีที่แล้ว +1

    Это уже второй урок который я с первого раза не понимаю...Ну ничего,раза два ещё посмотрю и точно пойму.Спасибо вам:)

  • @Вероника-щ1ф6у
    @Вероника-щ1ф6у 6 ปีที่แล้ว +25

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

    • @ВолодяСвіргун-х5д
      @ВолодяСвіргун-х5д 6 ปีที่แล้ว +10

      Могу тебе свои лабораторки скидывать

    • @lejouet2183
      @lejouet2183 6 ปีที่แล้ว +1

      Бро, мне тоже скинь лабы. Заранее спасибо)

    • @Роман-т5е6с
      @Роман-т5е6с 3 ปีที่แล้ว

      @@ВолодяСвіргун-х5д Братан,скинь пж

    • @dikii45
      @dikii45 3 ปีที่แล้ว +5

      @@Роман-т5е6с спустя 3 года)))) ну если скинут то и мне скинь)

    • @CoolbitsVDA
      @CoolbitsVDA ปีที่แล้ว

      @@ВолодяСвіргун-х5д Спустя 4 года (кто больше?) И мне скинь плиз!!!

  • @МихаилКрылов-п5ч
    @МихаилКрылов-п5ч 3 ปีที่แล้ว +3

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

  • @archiechellaut9483
    @archiechellaut9483 3 ปีที่แล้ว +2

    Большое спасибо вам за урок и прекрасное пояснение, Сергей!

  • @janaschelle8377
    @janaschelle8377 5 ปีที่แล้ว +4

    Очень хорошие уроки, понятным языком! Большое спасибо!

  • @Alex_Suvorov
    @Alex_Suvorov 9 หลายเดือนก่อน

    Спасибо за уроки!! После предыдущего было очень просто, весь код практически смог сам написать, ставя на паузу, только с if не додумался)

  • @ГароКесян-р8б
    @ГароКесян-р8б 5 ปีที่แล้ว +1

    я рад тому что вы есть этот и прошлый урок я смотрел 5 раз и едва смог его осилить спасибо вам от простого школьника

  • @somwho_somewhere
    @somwho_somewhere ปีที่แล้ว

    Круто и наглядно сделано! Правильная подача для новичкои. Проблема многих книг - это завышенная сложность синтаксиса сбивающая новичков.

    • @Empty_line
      @Empty_line ปีที่แล้ว

      Привет, почему у конструктора и оператора адреса похожи? 18:15

  • @CoolbitsVDA
    @CoolbitsVDA ปีที่แล้ว

    Очень спасибо Сергею за прекрасные уроки! Вдвойне приятно, что поставив видео на паузу где-то посередине, я понял , что смогу перегрузить оператор сам и сделал это.

    • @Empty_line
      @Empty_line ปีที่แล้ว

      Привет, почему у конструктора и оператора адреса похожи? 18:15

  • @Ermine882
    @Ermine882 7 ปีที่แล้ว +14

    Спасибо за урок.

  • @Гычпук
    @Гычпук ปีที่แล้ว

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

    • @frosten5746
      @frosten5746 ปีที่แล้ว

      И какая понял что к чему?

    • @Гычпук
      @Гычпук ปีที่แล้ว

      @@frosten5746 да

  • @SimpleCodeIT
    @SimpleCodeIT  7 ปีที่แล้ว +10

    #перегрузкаоператоров #ООП #SimpleCode #урокипрограммирования

  • @morskoy_ezhik
    @morskoy_ezhik ปีที่แล้ว

    Сколько уже смотрю уроки на этом канале, и только сейчас заметил, что на фоне играет жесткий рок)

  • @elvinaustin1022
    @elvinaustin1022 5 ปีที่แล้ว

    Все понял , после пред идущего урока , этот урок сразу отлично понял , спасибо Серега за тщательное разъяснение.

  • @onlyrock1351
    @onlyrock1351 4 ปีที่แล้ว +2

    Спасибо, всё просто и интересно!

  • @panschindler9370
    @panschindler9370 4 ปีที่แล้ว +31

    Сурс урока. Может кому надо будет...
    #include
    #include
    using namespace std;
    class Point
    {
    private:
    int x;
    int y;
    public:
    Point()
    {
    x = 0;
    y = 0;
    cout

  • @ИгорьОрлов-ж3ц
    @ИгорьОрлов-ж3ц 6 ปีที่แล้ว +3

    Спасибо земеля! Очень нужные уроки, я надеюсь. Был бы кто-то другой на твоём месте, то давно бы уже бросил изучать. На самом деле мозг уже отключается для восприятия информации. Испробовал методы заставить мозг работать,-гуляние на свежем воздухе, кофе, физ.зарядка, но чувствую пропадает желание к обучению. Какие способы себя заставить можете посоветовать, -ведь нежелательно делать большой перерыв, так как можно забыть чему научился.

    • @Slime191
      @Slime191 6 ปีที่แล้ว +4

      Лучший способ заставить себя учиться- Желание. А если его нет, то ищи способы его культивировать.
      Я смотрел разные фильмы, музыку, искал плюсы в чём-то и втягивался. В итоге, когда желание есть ,можно шпрехать не на голом энтузиазме и силе воли, а на нескончаемом генераторе энергии- Желании)

  • @vskavronskyi
    @vskavronskyi 3 ปีที่แล้ว

    Весьма хорошая подача материала, Вы большой молодец!

  • @ylikitishnik1946
    @ylikitishnik1946 3 ปีที่แล้ว

    со второй попытки понял спасибо за урок

  • @Артьом-о2ъ
    @Артьом-о2ъ 4 หลายเดือนก่อน

    Обычно в реализации оператора присваивания также проверяют, происходит ли самоприсваивание (то есть, this и &other указывают на один и тот же объект). Это позволяет избежать ненужных операций. Это может выглядеть так:
    if (this == &other) {
    return *this;
    }
    Эту проверку можно вставить в начале метода.

    • @Артьом-о2ъ
      @Артьом-о2ъ 4 หลายเดือนก่อน

      Вот пример улучшеного кода:
      Human& operator=(const Human& other)
      {
      if (this == &other) {
      return *this; // Проверка на самоприсваивание
      }
      cout data = new int[other.size];
      for (int i = 0; i < other.size; i++) {
      this->data[i] = other.data[i];
      }
      return *this;
      }

  • @Hunve
    @Hunve 2 ปีที่แล้ว +3

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

    • @viper_0097
      @viper_0097 11 หลายเดือนก่อน

      А потом переполнение стека...

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน

      Это не рекурсия, это просто реверс

  • @nicivanov5135
    @nicivanov5135 3 ปีที่แล้ว

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

  • @Newsvan1
    @Newsvan1 5 ปีที่แล้ว

    Всё очень понятно и подробно расписано. Большое спасибо!

  • @Evgeny..
    @Evgeny.. 4 ปีที่แล้ว

    Спасибо за уроки!!!!!!!

  • @zubrailx6416
    @zubrailx6416 4 ปีที่แล้ว +3

    Останавливаюсь тут, основные моменты языка вроде как понял, а пока пойду на пайтон. Конечно, не собираюсь бросать этот язык, просто немного огонек подсбавлю, 15 видео в день по-моему многовато, буду 1-2 усваивать. :) А пока на фриланс!)

    • @alexgaran5339
      @alexgaran5339 4 ปีที่แล้ว

      Я уже месяца 3 по одному видео смотрю. Так легче усваивать. Все не запомнишь.

  • @dangerous2627
    @dangerous2627 ปีที่แล้ว +37

    У меня перегрузка мозгов

  • @glebskachko1811
    @glebskachko1811 6 ปีที่แล้ว

    Невероятно спокойно и доходчиво. Курс ООП с универа за месяц у тебя прошёл за 10 часов :)

    • @VIONICK08
      @VIONICK08 6 ปีที่แล้ว

      не одно и то же?

  • @ИльяСоседский-л6о
    @ИльяСоседский-л6о ปีที่แล้ว +1

    лучший из лучших

    • @Empty_line
      @Empty_line ปีที่แล้ว

      Привет, почему у конструктора и оператора адреса похожи? 18:15

  • @bulba1995
    @bulba1995 2 ปีที่แล้ว

    Да тут я поплыл ,вроде как все понял но не точно. Спасибо

  • @8lxckcxt
    @8lxckcxt 4 ปีที่แล้ว

    Спасибо! идём дальше

  • @romkagm7756
    @romkagm7756 3 ปีที่แล้ว

    Чихнул когда сказал что его зовут Сергей - значит правда =)

  • @Anton-og1wm
    @Anton-og1wm 2 ปีที่แล้ว

    Братан, Это очень круто!!!!

  • @DenKof81
    @DenKof81 5 ปีที่แล้ว

    Спасибо за урок!

  • @КОД-ш8у
    @КОД-ш8у 5 ปีที่แล้ว +6

    єто как в сказке Алиса В Стране Чудес - кролик откусил сам себе свою же голову :-)

  • @ИванКозловский-ш9н
    @ИванКозловский-ш9н ปีที่แล้ว

    привет из 2023, спасибо большое за уроки!

  • @666towelie
    @666towelie 4 ปีที่แล้ว +3

    Спасибо за урок! Не понял только зачем делать проверку указателя data на nullptr, ведь ничего не произойдет если мы вызовем delete указателя, указывающего на nullptr?

  • @RrRrRrRroman
    @RrRrRrRroman ปีที่แล้ว +2

    Блин, весь урок понимал-понимал, в последние 3 минуты всё сломалось)))

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน +1

      Ёкарный бабай, тоже самое, но я сонный ночью посмотрел

  • @etniqa3638
    @etniqa3638 5 ปีที่แล้ว +2

    вечный курс

  • @ARproj
    @ARproj 6 ปีที่แล้ว

    попробую угадать досмотрев до 10:16 что должен возвращать указатель на то куда присваиваем :)

  • @yoqo
    @yoqo 5 ปีที่แล้ว +2

    4:19 Не очень понял, почему так.
    Если мы присваиваем одному объекту другой, то копируются только значения полей. По крайней мере, "this" у них отличаются, и, меняя одно из полей в копии, не меняется поле в оригинале.
    Так почему же объект "a" начинает думать, что он и есть объект "b"?

    • @andreyvolkov3117
      @andreyvolkov3117 4 ปีที่แล้ว

      Я понял (я не уверен), что это из-за работы с динамической памятью, т.к. data в private имеет указатель(*). И формально, мы передаём данные по данному указателю (ну, другое само собой придётся тоже делать под такой тип, чтобы работало, я про всё в классе)

    • @almatytelecom1
      @almatytelecom1 3 ปีที่แล้ว +1

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

  • @alexanderzaretskiy4188
    @alexanderzaretskiy4188 3 ปีที่แล้ว +1

    Проверка на delete nullptr не нужна, т.к. delete в этом случае не предпримет никаких действий. А вот проверить на случай:
    MyClass A;
    A = A;
    вполне стоит, без проверки присвоения самого себе произойдет неприятная ситуация потери данных...

  • @outcast-cr5yy
    @outcast-cr5yy 6 ปีที่แล้ว +3

    Черт) сложновато. Но все равно спасибо.

  • @gans0072
    @gans0072 ปีที่แล้ว

    23:05 для чего он поставил & между MyClass и operator ? буду очень благодарен за ответ.

    • @mashauser1812
      @mashauser1812 ปีที่แล้ว

      он же объяснил типо))) сам не понимаю

    • @gans0072
      @gans0072 ปีที่แล้ว

      @@mashauser1812 самое интересное, что я смог разобраться...

    • @peaktop3286
      @peaktop3286 ปีที่แล้ว

      @@gans0072 ну и почему?

    • @gans0072
      @gans0072 ปีที่แล้ว

      @@peaktop3286 я уже забыл..
      Что-то вроде указатель на указатель

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน

      @@gans0072 bruh ☠️

  • @mvoo2340
    @mvoo2340 ปีที่แล้ว +2

    А если при присваивании объектов друг другу всё равно им присваиваются разные адреса даже без перегрузки оператора, это новые версии компилятора или Visual Studio 17 так делает?

  • @Kokurorokuko
    @Kokurorokuko 3 ปีที่แล้ว +3

    Я не совсем понимаю, почему мы возвращаем ссылку на объект, а не сам объект. Объясню что я имею в виду.
    Когда мы присваиваем объект a в объект b оператором b = a; мы фактически вызываем функцию b.operator=(a); То есть мы в качестве аргумента используем САМ ОБЪЕКТ а. А уж в самой функции используется его ссылка с помощью оператора &. Это понятно.
    Но если мы вернём из функции ссылку на объект b, то функция c = b будет принимать не САМ ОБЪЕКТ b, а ссылку на него. И в функции будет использоваться ссылка на ссылку. Разве не так?
    Пример (упрощенный, но с той же идеей):
    int& Foo(int value)
    {
    return value;
    }
    // функция возвращает просто ссылку
    тогда почему же в main мы МОЖЕМ написать так:
    int a = 2;
    int b;
    b = Foo2(a);
    Как это так мы в b присваиваем ссылку на a, если b типа int, а не int* ?

    • @Kokurorokuko
      @Kokurorokuko 3 ปีที่แล้ว +2

      Я не уверен, что до конца понял, но попробую объяснить это на том уровне, на котором всё-таки дошло. Если вспомнить урок про ссылки, то там говорилось, что ссылочный тип не требует разыменования. Соответственно, написать
      b = Foo2(a);
      это то же самое, что и написать
      int& c = Foo2(a);
      b = c;
      В последней строчке мы хоть и работаем с ссылкой, но никаких операторов к ней не применяем. Т.к. запись "c" уже подразумевает только значение, лежащее по этому адресу.
      Так и в примере с объектами. Мы возвращаем ссылку на объект b после первой операции присваивания, а потом уже эта ссылка, как результат функции, никаких операторов разыменования не требует, поэтому мы спокойно используем её в функции.
      Хотя всё-равно получается в функции ссылка на ссылку, но это, я так понимаю, нормально.
      Кстати, объяснять что-то кому-то другому бывает полезно для собственного понимания вопроса.

    • @almatytelecom1
      @almatytelecom1 3 ปีที่แล้ว

      изучи конкретно , что такое ссылка и ты поймешь.

    • @aviator1472
      @aviator1472 ปีที่แล้ว +2

      ​@@almatytelecom1 я изучил и все равно не понимаю почему у автора в конце Myclass & operator= вместо просто Myclass operator=? Мы же все равно возвращаем САМ объект *this...

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน

      @@aviator1472 да дурдом тут какой-то

  • @зайка-щ9о
    @зайка-щ9о ปีที่แล้ว

    Спасибо тебе !!!

  • @topervidos3640
    @topervidos3640 5 ปีที่แล้ว +3

    Обращение к автору. Объект a не будет думать, что он объект b. Потому что, присваивание идёт только по значению, а адреса у обеих переменных, разные так и остаются как и были изначально. Посмотрите, что вы преподаёте с 4 м. 20 сек. ролика.

    • @Hippan_
      @Hippan_ 5 ปีที่แล้ว

      правильно говоришь по значению...все верно, только эти значения адреса объектов...адреса у a и b останутся разные но если значения их станут равны ссылаться они будут уже на один объект...

  • @zzz-vl7ju
    @zzz-vl7ju 4 ปีที่แล้ว +2

    Спасибо! Я даже понял почему мы ссылку возвращаем ! Очень круто . Спасибо вам огромное .(Вопрос)Мы можем с помощью delete удалить данные из статической памяти ?

    • @aviator1472
      @aviator1472 ปีที่แล้ว

      И почему мы возвращаем ссылку? Для чего вообще нам эта ссылка если мы возвращаем *this тоесть тот же объект..

  • @Владислав-ф3х6ж
    @Владислав-ф3х6ж 3 ปีที่แล้ว

    Подскажите, какой комбинацией клавиш можно быстро закомментировать код, как на видео в момент 6:47

    • @RayTracingX
      @RayTracingX ปีที่แล้ว

      Узнали? Можно мне тоже узнать?

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน

      @@RayTracingX не актуально?

  • @apchike-masala
    @apchike-masala 4 ปีที่แล้ว +3

    я понял что делает конструктор копирования.
    я понял зачем он копирует объект при передачи его в функцию(потому что передаём его по значению)
    Я НЕ понял зачем он вызывается при возврате объекта из функции.
    Зачем создаётся временный объект для хранения полей возвращаемого объекта?
    объясните пожалуйста!!

    • @almatytelecom1
      @almatytelecom1 3 ปีที่แล้ว

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

  • @АндрейСапрыгин-к7к
    @АндрейСапрыгин-к7к 4 ปีที่แล้ว +2

    то есть, как я понимаю мы перегрузили оператор равно так, чтобы он выполнял функцию конструктора копирования?

  • @GamerGuyMen
    @GamerGuyMen 4 ปีที่แล้ว +2

    Я так полагаю, что мы возвращаем значение из-за того, что в итоге при присваивании объекта b к c оператор у нас не будет перегружен, если не вернется ссылка на объект

  • @1kuso4ek
    @1kuso4ek 4 ปีที่แล้ว +2

    А как тогда поступить, если мы создаем объект класса в динамической памяти, то есть, допустим, у нас класс, содержащий одно поле - имя, мы создадим два объекта, в классе реализуем перегрузку оператора присвоения, присвоим и как дальше? Как очистить область памяти?
    MyName* person_1 = new MyName();
    MyName* person_2 = new MyName("Nik");
    person_1 = person_2;
    delete person_2;
    delete person_1;
    //реализация перегрузки оператора присвоения:
    MyName& operator = (const MyName& other) {
    cout

    • @svvonline1
      @svvonline1 ปีที่แล้ว

      У Вас произойдет утечка пямяти и программа вылетит с ошибкой. Вы один и то же объект удалаяте два раза. Никакой оператор присваивания у Вас вызываться не будет. Вы просто прсвоили одному указателю значение другого указателя.
      Нужно: *person_1 = *person_2;

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน

      @@svvonline1 Это понятно. Но вопрос то был о другом...

  • @PazhilayaGodzila
    @PazhilayaGodzila 3 ปีที่แล้ว

    6:48 подскажите, пожалуйста, каким сочетанием также комментировать

  • @tsohee9145
    @tsohee9145 5 ปีที่แล้ว +9

    В 145 строке наверно можно уже писать не "other.Size", а просто "Size"? 19:38

  • @eninyri
    @eninyri 5 ปีที่แล้ว +3

    привет. только ты не рассказал почему вызывается конструктор копирования после команды return *this ! давай раз уже начал!

    • @almatytelecom1
      @almatytelecom1 3 ปีที่แล้ว +1

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

  • @jack_adamson
    @jack_adamson 2 หลายเดือนก่อน

    люди добрые подскажите пожалуйста!Для чего мы присваиваем (this->Size = other.Size;) Ведь в дальнейшем мы будем обращаться к объекту (other.Size) например при выделении памяти для дин.масива (this->data = new int[other.Size];) или когда мы перебираем массив ( for (int i = 0; i < other.Size; i++) )
    Для вас может показаться вопрос глупым но я не могу понять для чего мы выполняем присваивание

  • @SAFO-MAN
    @SAFO-MAN 5 หลายเดือนก่อน

    Проверка на nullptr при очистки памяти с помощью delete[] не нужна, delete[] в C++ (в отличии от free в Си) может спокойно сжирать nullptr и никаких утечек не будет👌

  • @TheZandrey
    @TheZandrey 7 ปีที่แล้ว +4

    думаю еще надо учесть момент a = a;

    • @faustomendez6567
      @faustomendez6567 6 ปีที่แล้ว +1

      this в помощь

    • @wasony.126
      @wasony.126 4 ปีที่แล้ว

      @@faustomendez6567 хорош

    • @aviator1472
      @aviator1472 ปีที่แล้ว

      ​@@faustomendez6567 а причем тут this?

  • @nikitasuyazov2060
    @nikitasuyazov2060 6 หลายเดือนก่อน

    Вот этот конструктор "MyClass(const MyClass &other)" так выносит мозг наличием ссылки &other. Вроде всё знакомо, но в целом почему после вызова "MyClass b = a;" идёт 2 перегрузка сложно.

    • @sleepyNovember_project
      @sleepyNovember_project 6 หลายเดือนก่อน

      Внимательнее смотреть и слушать надо

    • @nikitasuyazov2060
      @nikitasuyazov2060 6 หลายเดือนก่อน +1

      @@sleepyNovember_project это очевидно. Но не только.

    • @sleepyNovember_project
      @sleepyNovember_project 6 หลายเดือนก่อน

      ​@@nikitasuyazov2060 ну как, уже понял? :)

    • @nikitasuyazov2060
      @nikitasuyazov2060 3 หลายเดือนก่อน +1

      @@sleepyNovember_project уже понял)

    • @sleepyNovember_project
      @sleepyNovember_project 3 หลายเดือนก่อน

      @@nikitasuyazov2060 замечательно

  • @СергейМедведев-т9т
    @СергейМедведев-т9т 3 ปีที่แล้ว

    Спасибо!

  • @ИванКомаревич-е1т
    @ИванКомаревич-е1т ปีที่แล้ว

    Красава!

  • @naikvitlich1093
    @naikvitlich1093 6 ปีที่แล้ว

    Круто!

  • @Артьом-о2ъ
    @Артьом-о2ъ 4 หลายเดือนก่อน

    Что означает в сроке this->Size = other.size, зачем там точка "other.Size"? и что она означает?

  • @ДмитрийРоманчук-д2н
    @ДмитрийРоманчук-д2н 4 ปีที่แล้ว +3

    Может кто то к примеру сказать где это используется, а то уже нить потерял зачем она используется, тока надо пример из реальной жизни, что писать чтобы работало понятно, нужен просто пример

  • @lllZarakilll
    @lllZarakilll ปีที่แล้ว

    Понял суть, деталицазцию под капотом не всю. Меня терзает только один вопрос - Зачем все это нужно? Практическое применение, жаль что не приводятся примеры этого.

    • @forixsins
      @forixsins ปีที่แล้ว

      Удобство, но это если умеренно применять. В перегрузках с выделением памяти вообще специфика жëсткая, это скорее для прошареных тема

  • @СергейКурмей-я9ь
    @СергейКурмей-я9ь 9 หลายเดือนก่อน

    спасибо)

  • @aleksandrdrobyshev7623
    @aleksandrdrobyshev7623 4 ปีที่แล้ว

    Хочу добавить один момент, который может быть не очевиден.
    Рассмотрим работу оператора присваивания ПОСЛЕ того, как Сергей дополнил его возвращаемым значением *this
    1) Когда выполняется инструкция a = b; значение *this возвращается, но НЕ ИСПОЛЬЗУЕТСЯ.
    2) Когда выполняется инструкция c=a=b; - значение *this возвращается в первом присвоении, но НЕ используется, но, используется во втором присвоении, чтоб присвоить резльтат переменной с.
    Для более простого понимания можно написать так: с=(a=b). Не понимаю почему так, но так. Наверно я что-то паропустил в самом начале.

    • @almatytelecom1
      @almatytelecom1 3 ปีที่แล้ว

      так потому что есть понятие ассоциативность операторов(из математики). Ассоциативность бывает справа-налево или слева-направо.

  • @СолерИзАсторы
    @СолерИзАсторы 4 ปีที่แล้ว

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

  • @ЯрославГоловко-ф6и
    @ЯрославГоловко-ф6и 4 ปีที่แล้ว

    спасибо

  • @n1kes987
    @n1kes987 2 ปีที่แล้ว +1

    А почему бы нам не возвращать &*this из перегруженого оператора? Если я правильно понимаю, то this - указатель объекта на самого себя, *this - сам объект, а &*this - ссылка на этот объект.

    • @aviator1472
      @aviator1472 ปีที่แล้ว +1

      Я вообще не понимаю зачем там нужна ссылка если мы возвращаем САМ объект *this...

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน

      @@aviator1472 Наверное по сути ссылка там и не нужна, но только потому, что этот перегруженный оператор и так принимает объект по ссылке (в его аргументах задано)

  • @kaynsolo
    @kaynsolo 7 ปีที่แล้ว +2

    А что если мне нужно будет переинициализировать объект "a" второй раз? Сработает конструктор класса и мы получим утечку?

    • @panda9303
      @panda9303 5 ปีที่แล้ว

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

  • @velichkina_masha
    @velichkina_masha 3 ปีที่แล้ว

    Здравствуйте!Подскажите,пожалуйста,оператор присваивания и оператор копирующего присваивания это одно и то же?

  • @sleepyNovember_project
    @sleepyNovember_project 11 หลายเดือนก่อน

    c.operator=(a.operator=(b));
    Вот, наконец понял
    Когда для "c" вызывается перегруженный оператор, мы передаём в его аргументы "a", который в свою очередь должен сначала отработать свою перегруженную функцию и вернуть свой результат работы, поэтому он возвращает в "c" - "return *this;"(себя)

  • @C2H5OHH
    @C2H5OHH 3 ปีที่แล้ว

    Что такое other, после которого ставится точка и пишется что-то ещё? Помогите, пожалуйста!

  • @СергейПетров-б1ф
    @СергейПетров-б1ф 4 ปีที่แล้ว +2

    А почему нельзя просто очистить память в главной функции, перед return 0?

    • @jordyfrost
      @jordyfrost 4 ปีที่แล้ว +1

      Допустим ты играешь в игру 10 часов подряд, то уже на 30 минуте тебе нужно будет бежать в магазин за дополнительной ОЗУ.

    • @sleepyNovember_project
      @sleepyNovember_project 11 หลายเดือนก่อน

      Лол, надеюсь это был рофл такой

  • @TokiuDoki
    @TokiuDoki 5 ปีที่แล้ว

    Обязательно возвращать именно ссылку?

  • @michaelivanov1605
    @michaelivanov1605 4 ปีที่แล้ว

    Я не понимаю когда мы перегружаем классы, то вводя параметры 10, 2, 5 и т.д они подходят под все перегрузки и по этому всё выводится на экран? А a = b и c = a = b это просто примеры как это выглядит?

  • @matweymishenko2811
    @matweymishenko2811 6 ปีที่แล้ว +3

    Было бы уместное перед тем как начинать удалять массив проверять что other!= this

    • @voltamper96
      @voltamper96 6 ปีที่แล้ว

      да если a = a;