Copying and Copy Constructors in C++

Поділитися
Вставка
  • Опубліковано 4 січ 2025

КОМЕНТАРІ • 420

  • @Sokar599
    @Sokar599 6 років тому +1227

    finally a series on youtube I don't have to put on 2x speed lol

    • @fupopanda
      @fupopanda 5 років тому +54

      Agree. Watching on 1.5x speed. Can't go higher.

    • @KostasOreopoulos
      @KostasOreopoulos 5 років тому +32

      I am really curious If this is filmed at that speed. It is insanely fast

    • @canadianblitz3468
      @canadianblitz3468 5 років тому +9

      Up until episode 30 or so I was watching at 2x speed just so i can get back to the opengl series

    • @ondrejvencovsky6834
      @ondrejvencovsky6834 4 роки тому +50

      I'm at 50% speed and finally I understand he speaks english...

    • @macroxela
      @macroxela 4 роки тому +3

      Still watching at 2x speed. Otherwise he would be too slow

  • @dkrec2486
    @dkrec2486 7 років тому +647

    We're so lucky this C++ series are free x)

    • @aelthalyste6692
      @aelthalyste6692 7 років тому +30

      Until he realises he can buy a t-rex with his course money if it wasnt free.

    • @laurentiustefan398
      @laurentiustefan398 6 років тому +18

      then again asking 10$ for this course wouldn't be all that much

    • @Quaggabagel
      @Quaggabagel 6 років тому +15

      Laurentiu Stefan it is for some people who just want to learn

    • @raymondyoo5461
      @raymondyoo5461 5 років тому +3

      absolutely

    • @tamriel_x
      @tamriel_x 5 років тому +4

      @@Quaggabagel exactly what i was thinking as well, regardless im sure he gets a lot more support not asking and seeing what happens.. patreon is there for a reason..

  • @matthewwilson4592
    @matthewwilson4592 6 років тому +361

    The speed you go is perfect, most tutorials are too slow. I lose interest and get nothing. This isn't overly fast and can be followed, also you can tell you really know your stuff so if just flows. Good work, thanks.

    • @felixkimutai8478
      @felixkimutai8478 5 років тому +11

      I am worried, he's too fast

    • @marindraganov8765
      @marindraganov8765 4 роки тому +4

      You can play this at x0.75 or at x1.25 up to your personal preference. I am a bit ashamed to say but I might need x0.5 to get some understanding of the matter :)

    • @this_is_mac
      @this_is_mac 4 роки тому +4

      @@marindraganov8765 If I don't understand something, I keep repeating it

    • @pierfrancescopeperoni
      @pierfrancescopeperoni 3 роки тому +4

      @@this_is_mac While loop?

    • @g4fly4ever8
      @g4fly4ever8 2 роки тому +2

      @@pierfrancescopeperoni
      while(understanding == false){
      ReplayVideo();
      }

  • @comodinoh
    @comodinoh Місяць тому

    Every single video in this series is so incredibly informative and intuitive and the fact that it's a hundred episodes long makes it even better

  • @muneebj.4010
    @muneebj.4010 3 роки тому +31

    7:25 thank you for the solution for fixing random garbage at the end of a dynamic char array.
    I came here looking for copper
    But found gold

  • @bonehelm
    @bonehelm 4 роки тому +8

    Thank you so much. I've heard of this copy constructor topic many times and never understood it. You're the first person to explain WHY it's useful and the problem it solves.

  • @mikeorioles
    @mikeorioles Рік тому +5

    I've been rewatching this series just for fun, and as always the videos are excellent, informative, and concise.
    Thanks!

  • @fishyperil2153
    @fishyperil2153 7 років тому +86

    Even though I've already been through most of this stuff, I love watching your videos 'cause they're such a great way to remind me of some details I've forgotten, provide another viewpoint on some of these topics and deepen/solidify my understanding of them.
    If it weren't for these videos I'd probably have a whole lot of "backtracking" to do at certain points but just watching one of your videos every day or two really helps rearrange all this stuff in my head in some kind of orderly manner ^^
    Keep up the good work man, this series is basically the best online resource ever to do that sort of thing

    • @MsJavaWolf
      @MsJavaWolf 6 років тому +6

      Pretty much the same for me. Another benefit is, that I learn better ways to explain stuff, sometimes new team members will not be very good at C++, so I can use some of the examples in these videos when they have problems.

    • @letranminhkhoa7492
      @letranminhkhoa7492 3 роки тому

      So true. I thought I have understood all about copy constructor until I sit down and watch this video again and then I go "Ahhhhh so that is how it works"

  • @gopapriyajena8630
    @gopapriyajena8630 3 роки тому +5

    the best video for deep and shallow copy
    you really got concept clarity in each video
    really appreciate your work for society!
    love your work and explaining

  • @Plasticcaz
    @Plasticcaz 7 років тому +116

    As someone who learned C and Java at Uni, and is trying to learn C++, this was something that I didn't realize was important until recently. I think this helped solidify a few things in my head.
    I assume you're going to talk about Move constructors soon too.

    • @TheCherno
      @TheCherno  7 років тому +58

      Yes, we'll get into move semantics eventually. :)

  • @lored6811
    @lored6811 4 роки тому +111

    17:48 Little did he know it would take him 3 More Years...

    • @so7am96
      @so7am96 4 роки тому +9

      lol! me too, I actually watched the l, r values first

    • @Strategic.
      @Strategic. 2 роки тому

      lol

  • @jpack61108
    @jpack61108 2 роки тому

    ive said this before, and ill say it again.. this is one of the most informative code channels on youtube.

  • @disekjoumoer
    @disekjoumoer 3 роки тому +3

    Man, this series is good. Fast, to the point and makes me feel like I've just sniffed 20 grams of speed.

  • @abdulrahmanzaytoun3384
    @abdulrahmanzaytoun3384 3 роки тому +1

    How can I be so information-attended and creative in writing code and remembering it without facing any obstacles? I mean u're so fast, so good, keep going brother.

  • @AmitParopkari
    @AmitParopkari 2 роки тому

    this cleared concept of shallow vs deep copy, copy constructor, along with operator overloading & importance of pass by reference, brilliant!

  • @abdulbasir906
    @abdulbasir906 2 роки тому

    This is one of the greatest content I have seen on C++ copy constructors...Thanks Cherno

  • @serkanozturk4217
    @serkanozturk4217 2 роки тому +18

    Personal Notes:
    -Shallow copy becomes a problem for heap-created objects, not for stack allocated objects(might needs check)
    -Deep copy is performed by adding copy constructor. After writing copy constructor, you can use “entity1 = entity2” for deep copying
    -Explained pass by value vs pass by reference. It is safe to use const reference for the function not to be able to modify the object.

  • @davidcfrogley
    @davidcfrogley Місяць тому +1

    If you cannot assume `string` is null-terminated, then `m_Size` will be wrong, because `strlen()` counts characters until it finds the null character `'\0`. So you could update the constructor to accept the length as a parameter, or just be consistent in your assumptions.

  • @PflanzenChirurg
    @PflanzenChirurg 7 років тому +3

    The most perfect and not unliked video series on youtube. U rule my Career propably, at least you have a signifant influence about my clarity. I have to thank u

    • @rickyjoebobby1
      @rickyjoebobby1 4 роки тому

      no kidding, i havent seen many but these are high quality c++ videos

  • @mehmetedex
    @mehmetedex 2 роки тому

    detail is rich, pace is balanced, a sub is gained

  • @reptilicusrex4748
    @reptilicusrex4748 2 роки тому

    I recently found these C++ videos on YT. They're excellent. Thanks for the effort Cherno.

  • @overclockk
    @overclockk 4 роки тому +4

    Just want to say thanks for preparing me for my job interview.

  • @BT-fj9ek
    @BT-fj9ek 3 роки тому

    I am new to C++ and your tutorial just save my life, thanks a lot!

  • @rohitsrivastava4775
    @rohitsrivastava4775 6 років тому

    Ever since I stumbled across your channel , it has become a routine to watch one or more of your videos . I don't know it's like an addiction . You have such a clarity in your understanding at such an early age . Awesome and good luck.

  • @_DarkKnight2301_
    @_DarkKnight2301_ 4 роки тому

    This literally gave me the solution to an issue I was having related to dynamically creating pointers inside of a base class. I narrowed down the issue that the same location in memory was being deleted twice, but I didn't know the next step. Then this video got reccomend almost as if youtube just knew lol. I'll have to implement the copy constructor and try it out.

  • @samsawesomeminecraft
    @samsawesomeminecraft 5 років тому +3

    you said at 1:24 "so what I'm trying to tell you is always pass your objects by const reference" and I misunderstood that, trying to pass pointers to arrays by reference... it was a 1-hour nightmare fixing the resulting bugs

  • @voynich7119
    @voynich7119 2 роки тому +3

    Ah, looks like I have reached my first soft cap. Everything up to here was pretty easy to understand for me but I'm starting to feel that I have not understood the preceding topics well enough to follow this 100%. I get the problem you are trying to demonstrate but the stuff around it is a bit too shaky still. I will have to rewatch some of the previous videos and practice some more and I'm sure I'll understand this better because your explanation is done very well :)

  • @jahmurlopez379
    @jahmurlopez379 5 років тому +1

    Thank you so much for helping with that piece of code for 14:32

  • @seungminlee9793
    @seungminlee9793 4 роки тому +1

    Thank you. I knew vaguely about copying, but thanks to you I understand it clearly now. I'm also watching other videos from the C ++ series.

  • @hosseinbiniaz9379
    @hosseinbiniaz9379 Рік тому

    probably the best cpp video it covers so many things haha

  • @autumnleaf8483
    @autumnleaf8483 2 роки тому

    I love the humor this man has.

  • @thesanctuary225
    @thesanctuary225 5 років тому +4

    C++ is a great language.
    I admire sir. Bijarn Stroustrup as well as sir. Dennis Ritchie.

  • @thesanctuary225
    @thesanctuary225 5 років тому +8

    Creation of "Reference(&)" is one of the good improvement of C++ comparing with C.
    Reference gives more "memory efficiency" to us.

    • @nonnullptrhuman504
      @nonnullptrhuman504 2 роки тому

      Also if the function accept reference you don't have to check if the argument is null or not

    • @thewelder3538
      @thewelder3538 Рік тому

      This is very arguable. References are just dereferenced pointers and there's not a lot of difference between them. In fact, pointers have a lot more power than references because they can be null, changed and mutated. References never can.

  • @mohammednihad6755
    @mohammednihad6755 7 років тому +6

    this is the most interesting episode in the series :)

  • @phicoding7533
    @phicoding7533 2 роки тому

    Congrats on 500K subs man !

  • @onegamingmoose
    @onegamingmoose 7 років тому +177

    Charno - No char for you

  • @ahmeddeghady4510
    @ahmeddeghady4510 5 років тому

    You talk really fast and put so much information in just 5 seconds. For a beginner I find Your channel intimidating to watch as i really just understand the first minute and everything comes after slips away

  • @johntera4958
    @johntera4958 2 роки тому

    thanks alot man, you are the best. for me this is heavy stuff alr, but you make me so easy to understand.

  • @senemyildiz.
    @senemyildiz. 4 роки тому

    You are talking so fast. but your style is very clear. Thanks for sharing.

  • @wack1305
    @wack1305 2 роки тому

    TheCherno has taught me well; I saw the copies coming with the PrintString() function as he always passes by const ref to avoid this exact thing

  • @jul8803
    @jul8803 6 місяців тому +3

    C++ is so much more exciting than Python to learn...

  • @patrickg2416
    @patrickg2416 4 роки тому +1

    Deep Object.. Shallow Copy.. I saw that look! So many great analogies to make lol

  • @shawkontzu3990
    @shawkontzu3990 3 роки тому

    best video explaining copy and deepcopy

  • @electro.engineering
    @electro.engineering 3 роки тому

    Thanks for this video! It is amazing.
    Greetings from Germany!

  • @accessdenied9393
    @accessdenied9393 3 роки тому

    Awesome BUT so fasssst! I have to watch the video many times to better understand. Anyways you are still my professor

  • @Rok3y
    @Rok3y Рік тому

    You sir are a very good, thanks for these series!

  • @imrankhanrahat6031
    @imrankhanrahat6031 6 років тому

    Thanks for making a good example. It cleared Copy constructor, Deep/Shallow copy and reference.

  • @MetalCrotchGuy
    @MetalCrotchGuy 6 років тому +66

    There is no need to separately copy the NULL terminator in the constructor, you could've just used the m_Size + 1 in the memcpy, just like in the copy constructor, since if the string wasn't properly terminated, the strlen wouldn't work properly as well.

    • @Steve-gi2yj
      @Steve-gi2yj 5 років тому

      yes that worked for me to instead of his way, thanks :)

    • @AntonioAstorino
      @AntonioAstorino 5 років тому

      Agreed

    • @JohnnyThund3r
      @JohnnyThund3r 5 років тому +5

      Kinda glad he did it wrong though, the extra steps helped me understand it better and reading the comments gives one expertise.

    • @vesk4000
      @vesk4000 Рік тому

      Yeah I got confused about this exact thing.

  • @whiteHorse11011
    @whiteHorse11011 2 роки тому

    Thank You. This was an awesome video on c++ concepts.

  • @bradleymclean2018
    @bradleymclean2018 2 роки тому

    this video is still helpful in 2022. Thanks a bunch

  • @LowLevelLemmy
    @LowLevelLemmy 2 роки тому

    I love you Charno

  • @ardeipopa
    @ardeipopa 5 років тому

    Very helpful. Also note that you will make a copy when you return a String object

  • @Quancept
    @Quancept 4 роки тому

    Thank you so much Yan for these amazing videos. I don't have the money to support you on Patreon but one day I will definitely do it. Love from India :)

  • @mytech6779
    @mytech6779 2 роки тому +2

    The only exception that I can think of at the moment to the pass by const ref advice is with primitive types that can be created on the stack.(x86 specific) And that is because the speed of creating, using, and deleting stack frames is pretty close to the minimum lag physically possible due to a combination of cache coherence, registers, and the way the stack pointer works. In some cases the optimizer will not even assign a memory location to a stack primitive, it may live entirely within a cpu register; and deleting a frame is only a matter of decrementing the stackpointer which is generally a one CPU-cycle operation. Still its a pretty narrow case where a program would spend a substantial amount of time creating and deleting primitives.
    Along with the usual advice to not optimize too much until after getting the logic correct and profiling to find that big O chunk of code. (A bit of consideration for runtime efficiency is warranted during the initial draft just to avoid huge structural changes later on, just don't spend a bunch of time on it.)

  • @josefaschwanden1502
    @josefaschwanden1502 4 роки тому +3

    8:00 How would strlen() find out the lenght without a '\0' ?

  • @georgei2480
    @georgei2480 5 років тому +1

    @The Cherno. Pls, pls, pls make a Cherno branded T-shirt. I wanna but its to support you cuz I love what you do and I want others to know about you. the best way for me to spread the good word about your channel is with a T-shirt!

  • @forhadrh
    @forhadrh 3 роки тому

    0:01 - Yes! The subtitle was near perfect! Just misspelled his name tho. Great job UA-cam :p

  • @danielashmeadwright
    @danielashmeadwright 6 років тому

    Excellent example, really clear and concise, well done.

  • @vsevolodnedora7779
    @vsevolodnedora7779 3 роки тому

    Charno...
    Oh damn... and then I heard in my mind...
    "I am Charno, god of strive, god of slaughter, god of death! When there is pain, I am there. When there is suffering, I flourish. When there is a joy... well, one could hardly have joy, without another suffering, no?.. "
    Great series, by the way :)

  • @krazyolie
    @krazyolie 4 роки тому +2

    For some reason, at my old place of work work our style guide was against passing by reference but to use pointers instead. I'm not sure if they determined it was actually faster, or because they preferred more "C" style code. I don't think the advice was much heeded, though.

  • @michaelswahla4927
    @michaelswahla4927 2 роки тому +2

    To those who don't know what the keyword "friend" does:
    Friend is a keyword that allows functions declared outside of the class to modify private variables inside a class.

  • @darkpikachu_.
    @darkpikachu_. 3 роки тому

    Shin Lim does a good job teaching C++.

  • @martin_skachkov6016
    @martin_skachkov6016 2 роки тому

    Hello where i can find more information about new Vector() in 2:14 when you heap allocate it. What it actually does?

  • @zjfjack
    @zjfjack 4 роки тому

    Such a fantastic lesson! Second time to review this.

  • @nathannlatimore7863
    @nathannlatimore7863 4 роки тому

    This was a really comprehensive tutorial. Thank you!!

  • @TheSeanXe
    @TheSeanXe 2 роки тому

    At 8:01, since you were using strlen which calculates using null terminator, there will be a null terminator for that string, so it is safe to just copy it.

    • @michaelswahla4927
      @michaelswahla4927 2 роки тому

      Not for me, I got some garbage values after using memcpy() to copy the string and print it out.
      However writing this fixed my issue:
      m_buffer[m_size] = '\0';

  • @espressothoughts
    @espressothoughts 5 років тому

    Great job with this series!!

  • @QanarIsDelirious
    @QanarIsDelirious 2 роки тому

    Nice one :) i get the ideas of what that actualy does far better Then in highscool explanation

  • @chrisbred3393
    @chrisbred3393 2 роки тому +1

    Hi, I have a question where I could not find an answer yet:
    I want to have a stack allocated array initialized by a copy constructor. With the std::array it looks like following.
    class Polynomial
    {
    std::array my_array;
    int size;
    public:
    Polynomial(const Polynomial& p)
    : my_array{ p.my_array }, size(p.size) {}
    }
    How can I implement this without the std::array but only a normal int my_array[5];
    Thanks :)

  • @williamchamberlain2263
    @williamchamberlain2263 6 років тому

    Great summary, excellent, simple examples

  • @username17234
    @username17234 5 років тому +7

    Aren't you already assuming the string is 0 terminated when you measure its length using strlen?

  • @AndreiSokolov-k7j
    @AndreiSokolov-k7j 10 місяців тому

    8:06
    That's safety trick isn't gonna work, because strlen gives you len based on when he meets null, e.g if we gives him char a[] = {'a'}, then it's len may be not 1, but 32, or 40, or whatever any number, maybe even cause some errors.

  • @krishnababu5190
    @krishnababu5190 Рік тому

    @6:58 can we make operator

  • @fatguy321
    @fatguy321 2 роки тому

    around 14:20 wouldn't you want to use braces for constructor initialization instead of parentheses?

  • @tobiaslauss8200
    @tobiaslauss8200 2 роки тому

    Thank you, very well explained.

  • @asadanees781
    @asadanees781 5 років тому

    Nice explanation, awesome . Excellent work.

  • @pwlegolas3
    @pwlegolas3 4 роки тому

    Awesome Video .. All concepts well explained...!

  • @ארזעמיפייגלין
    @ארזעמיפייגלין Рік тому

    At 8:04 he's using a "0" for null terminator instead of "
    ". why did that work? how is th string terminator defined?

  • @doolee5704
    @doolee5704 Рік тому

    youre a great teacher, thanks

  • @aleksandarfranc1094
    @aleksandarfranc1094 5 років тому

    haha ChArno! Bro you are hilarious! Really like the series!!

  • @Maceta444
    @Maceta444 2 роки тому

    This was a quality lesson

  • @footballCartoon91
    @footballCartoon91 2 роки тому +1

    I just tried this technique
    and it work for object on the heap too..
    so now I realized const reference is used when the object we want to use
    does not need to be changed..
    although it is const it's value can be assigned to another variable like std:: vector or array

  • @elektrycy
    @elektrycy 9 місяців тому

    At 8:02 that would make no difference, because without terminating null we have no way of knowing the string length. strlen() actually keeps counting bytes until (char)0.

  • @韩志辉-f2c
    @韩志辉-f2c Рік тому +1

    How can I distinguish if the constructor in the instance you write is a copy constructor rather than a constructor with parameters? I feel a bit confused.

    • @mikeorioles
      @mikeorioles Рік тому

      A copy constructor explicitly pulls values from an existing class object (i.e. other) to create a copy it.
      A typical constructor simply creates a new object instance of a class.

  • @KatHarpy
    @KatHarpy 4 роки тому +1

    why do you set m_Buffer as a pointer but not m_Size?

  • @TarunKumarSaraswat
    @TarunKumarSaraswat 4 роки тому

    Amazing explanation ❤️

  • @evidently4772
    @evidently4772 3 роки тому

    Doesn't strlen assume null termination? So does code added after 7:50 really provide any robustness to strings without null termination?

  • @footballCartoon91
    @footballCartoon91 2 роки тому

    @12:50 ok so when i write
    String name="anybody";
    String anotherName=name;
    this means a shallow copy only i.e only copy the pointer to the object but not the object itself
    so basically when i write
    String name;
    is this actually a pointer to a "String" object? on the stack?

    • @footballCartoon91
      @footballCartoon91 2 роки тому

      now realizes that copy constructor is useful when you want to copy object on the heap i.e when you call "new " keyword if its on the stack there is no problem but the problem is on the heap which is when one of the objects involved in the copying process dies, another object will get reference to an object that already being deallocated..so you must provide your own deep copy using memcpy() function to copy the objects/value to another memory address so when one object get deallocated another object being copied still lives

  • @chenjin6407
    @chenjin6407 4 роки тому

    Thank you Charno, I have learned a lot from you : )

  • @TKcKoucher
    @TKcKoucher Рік тому

    Fantastic content!!!!

  • @daniel-kun6443
    @daniel-kun6443 Рік тому

    Cherno you've said that if you can't be sure the string is null terminated, then just plop in a zero at the end of the string.
    But IIRC strlen() makes that assumption for you so the deliberately plopping in a zero at the end by you is irrelevant really, 7:55

  • @MinMorts
    @MinMorts 4 роки тому

    hey youre really good at explaining things cheers!

  • @jackson1124
    @jackson1124 4 роки тому

    Very confused on why 7:13 works. Since he's pushing a char pointer into the ostream but never derefences it?

  • @patrickes4540
    @patrickes4540 4 роки тому

    Great explanation. Thank you!

  • @MegtaBubble
    @MegtaBubble 7 років тому +1

    The action is starting!

  • @FadeStrategy
    @FadeStrategy 4 роки тому

    This is a lifesaver

  • @John2137Paul
    @John2137Paul 4 роки тому

    Your tutorials are amazingly well done, and helped me a lot, thanks man!

  • @LordFers
    @LordFers 7 років тому

    ¡Happy day, Cherno!

  • @wazreacts
    @wazreacts Рік тому

    I've finally cracked the code. 0.5x Cherno is Cherno on his third bottle of wine...

  • @catalinasdfghjkl
    @catalinasdfghjkl 4 роки тому +1

    what is the m_ before variable names ? Is that a standard way of naming variables?

    • @thederickff
      @thederickff 4 роки тому

      Yes, the m_ means the variable is a member of the class, it's just a convention, just like s_ variables means they are static