Member Initializer Lists in C++ (Constructor Initializer List)

Поділитися
Вставка
  • Опубліковано 7 лют 2025
  • Patreon ► / thecherno
    Twitter ► / thecherno
    Instagram ► / thecherno
    Slack ► slack.thechern...
    Discord ► / discord
    Series Playlist ► • C++
    Gear I use:
    -----------------
    BEST laptop for programming! ► geni.us/pakTES
    My FAVOURITE keyboard for programming! ► geni.us/zNhB
    FAVOURITE monitors for programming! ► geni.us/Ig6KBq
    MAIN Camera ► geni.us/t6xyDRO
    MAIN Lens ► geni.us/xGoDWT
    Second Camera ► geni.us/CYUQ
    Microphone ► geni.us/wqO6g7K

КОМЕНТАРІ • 273

  • @samdavepollard
    @samdavepollard 4 роки тому +53

    watched this earlier today and have just written my first constructor initializer list
    i confess, i'm feeling pretty gangster right now

  • @DaRealPielover1987
    @DaRealPielover1987 7 років тому +212

    Hey Cherno. Just want to say that this series is one of the best I've seen on youtube. I've been in the industry for about a year now but having refreshers like these are always good. Like I haven't actually thought about why I use member initializer lists in years since I've just gotten in the habit of doing so. I'm looking forward to more videos so that I can fully recommend this series to more novice programmers.

  • @LoxagosSnake
    @LoxagosSnake 7 років тому +169

    Lost it at the closed captions.
    "Hello guys my name is a cheddar"

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

      Cheddar Bob

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

      @@nijucow i ALWAYS hear: " My name is 'Ocherno' "

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

      I always hear it: "My name is the Cyano"

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

    I didn't realize this actually had performance benefits.
    When I first saw them, I thought they were just a nifty way of writing constructors.

    • @mryup6100
      @mryup6100 4 роки тому +21

      Exactly, needs better documentation.

  • @drkerberos
    @drkerberos 4 роки тому +7

    Mind blown @The Cherno. As I said in a earlier video and will say now you are the best C++ teacher and course on UA-cam. To the way you describe subjects to asking the biggest question of why you would need to use them and giving an example. To be honest I thought I would never be able to learn programming and actually learning the materials until I went to college and forced myself but I was wrong. I wish I found this channel sooner than I did. Big props to you though in helping everyone and making this playlist. I can't wait to learn more from the rest of the videos and then try and make a simple project later on.

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

    Also you cant initialize *const* members without using "Member initializer".

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

      I was going to write same thing. :)

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

      if I'm not mistaken reference types also must be initialized in the initializer list

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

      What about static .?

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

      @@venkateswarans1012 Well, those will be initialized by default I think, because you can access them without creating an object

    • @jatinchadha7740
      @jatinchadha7740 4 роки тому +7

      Basically all members which should be initialized at time of declaration should be written in initializer list like const , references etc.

  • @hexi3064
    @hexi3064 4 роки тому +35

    Member Initializer List allows you to use references as properites of a class. (Without using it, you cannot do it because references has to have assigned values while being created.)

  • @zfighter3
    @zfighter3 7 років тому +37

    Holy cow. It's like a constant stream of videos!! I use some of your videos as reference for my high school classes. Cheers!

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

    Incredible video series that will remain relevant for years to come. Nice work man, appreciate it.

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

    Cherno makes both C++ and teaching C++ look easy
    Heck, been reading some Stanley Lippman and that dork just sux ass explaining, and the book is a fucking minotaur maze. While Chemo makes it crystal clear and enjoyable. I just feel like I'm having a great company and we speak same language. I feel so much better watching these. Thank you, Cherno, you bring a lot to this world

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

    Great work! I would like add two things though, I am not really sure why 2:48 "make sure you always initialize your variables in the same order that they are declared in when you declared them as members" If the order of initialization only matters on the order of member declaration when using initialization list it should not matter in which order I initialized them, it would matter if I had not used initializer list and initialized inside curly braces. Second the main reason that initialization by list is better is that it only calls the constructor but if I initialize inside curly braces a copy assignment is performed after the constructor. Scott meyers 55 ways item 4. Again keep up the good work.

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

      You just keep the order the same as your members to not confuse yourself. Try something like Entity:m_x(5),m_y(m_x+1) and flip the order.

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

      i mean, he explicitly states that it could mess up depending on the compiler. and feels like he's mostly encouraging this for good practice.

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

    Thank you! That's a really amazing simple but clear demo

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

    First of all really thank your for all the videos. Even though the most concepts may be known by a lot of people already, it's interesting to see what happens behind the scenes. For example the Initializer lists. I knew they would be better in terms of performance in some situations.. but I never actually knew why and when especially. I didn't even feel the need to look it up. But I just like to know things like those, so these videos are really interesting and helping me out!
    And I like it, you are not discriminating primitive types nor classes!

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

    amazing explaination and that is amazing effect there when you said like and the like button actually glowed , woah mindblown

  • @joshs2475
    @joshs2475 7 років тому +95

    Don't forget Member Initializer Lists can also be used for initializing const member variables as well!

    • @deltarambo6230
      @deltarambo6230 4 роки тому +17

      Basically, all data-members which should be initialized at time of declaration, such as const , references, etc., must be included in the constructor's initializer list.

  • @legendarytwister3656
    @legendarytwister3656 8 місяців тому +1

    i didnt know that. thanks, ive watched alot of your videos you are doing great work. cheers

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

    Wanted to say thanks! Your videos are great and are a huge help to me in understanding C++.

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

    I just want to thanks for this great content
    one of the best c++ courses on UA-cam

  • @wearyadventurer404
    @wearyadventurer404 4 роки тому +6

    "hey little guys my name is a chadder and welcome back to my say plus plus series" xD

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

    This video should come before the virtual functions video!

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

      Greatgreat video though, I will forever use this from now on!

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

    @TheChernoProject Man! You rock!!!. I was having trouble understanding this but you made it so simple with ur examples. Thanks!

  • @h.hristov
    @h.hristov 7 років тому +4

    Thanks for the daily uploads :D

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

    Yay! I finally am back online and can catch up with these awesome videos!

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

    Dude thank you so much I love your videos

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

    YOU ARE AMAZING!

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

    Love you man, C++ for life

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

    Thank you, exactly what I was looking for.

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

    "if we....were to....move this...." haha thanks William Shatner, that was very helpful. In all seriousness though I really dig these videos and am looking forward to the opengl series.

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

    Photo on the wall is awesome!

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

    You are the best cherno.

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

    and also Initializer list is helpfull when you have to initialize "const" variables/objects inside a class, because you can't overwrite const objects with "=" operator :)

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

      Basically, all data-members which should be initialized at time of declaration, such as const , references, etc., must be included in the constructor's initializer list.

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

    I cannot think of another UA-camr with such a high likes to dislikes ratio under his videos. Is this how perfection looks like?

  • @teosurch
    @teosurch 11 місяців тому

    Thank you! Finally got the new constructor syntaxis ( a(a1) like instead of this->a = a1 );

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

    Mr. Cherno
    . You are my hero

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

    Cherno does not miss

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

    Great video, very easy to understand, bought the book: ‘effective c++ third ed.’ Great compliment to that book.

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

    It's really good to learn that.

  • @matt-g-recovers
    @matt-g-recovers 4 роки тому +1

    Very cool, I like this style vs Java

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

    Should use uniform initialization '{}' instead of '()' because it will warn on implicit narrowing conversions. '()' will silently allow, for example, an int to be truncated to a char.
    So this is better
    public:
    Entity() : m_Name{"Unknown"}, x{0}, y{0}, z{0}
    { std::cout

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

    Some think that I do not understand is that even after moving m_Example(8) in to initializer list, the Example m_Example is still in line 22, and as Cherno said, because it is in member region it does not mean that it will nor run and create an instance. So, why now does not create an instance!

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

    Thank you for this!

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

    what if you used like std::string& then would it still douplicate it

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

    Personal Notes:
    - Way of constructing objects by assigning members values
    - Not only a coding style, if you don't use that you initialize objects twice , one when declaring the member, and the other one when assigning it to a different object again inside constructor which takes parameters

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

    you deserve as much as subscribers as PewDiePie

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

    also if the Example class does not have a default constructor then initializing it inside constructor body does not work, it should be explicitly initialized in the initializer list.

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

    i can hear a robot talking in background lol
    confirmed cherno is not a human

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

    you are my hero

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

    Can you please do a video on padding and alignment as well as the pIMPL idiom?

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

    in this video exactly in 00:12 you said " initialize our class member functions " i think you meant " class member ( the variables that are members in the class ) " not " member functions " , right ?

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

    Another frustration explained!

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

    Appreciate you!
    Great content!
    Thank you!

  • @krec348
    @krec348 7 років тому +4

    YES! DAILY VIDEOS :D

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

    Ur videos are awesome bro..Keep it up...u r genius

  • @Nick-lx4fo
    @Nick-lx4fo 4 роки тому

    Thank you

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

    I am quite sure, that if you try this in Release mode, then you get the same result with init list and without.

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

    brillant!!

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

    These video's are the best! :D

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

    Please do a video kn std containers. Lists and algos like for each

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

    thanks man , you save me

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

    *My takeaways:*
    Why should we use member initializer lists 3:10: clean code and speed advantage

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

    Why not immediate initialize them inside the class instead of inside constructor?

  • @qandos-nour
    @qandos-nour 4 роки тому

    thank you
    you are the best

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

    5:39
    i don't understand that part. I'm not getting a value when i'm using string

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

    This is amazing. Code changer for sure y'all!

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

    So far, I've left initializers out of pnfha, because what I would have had the option to do is make a function with 2 bodies. Maybe it wouldn't be that way later in development though...

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

    Wow thanks!

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

    great video but i had to turn the play back speed down. For 4:35 onwards you just put it in turbo mode and blew by it. a little confusing...

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

    That.... was totally new to me.

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

    Hello I have a question can we use c++ for web application's the part of backend ? can you teach how to create web-backend or desktop applications or how can we use c++ for mobile (some percentage) please give me answer.

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

      Look at webassembly

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

    3:17 why why!! thank you for asking that. wow... performance issues. good enough for me.

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

    I'm a bit confused about 4:10. You're saying the member will be constructed twice: once in the default constructor, and again with the "Unknown" string value. Where I'm confused is that the default constructor is already being used in your example to set the string to "Unknown" already. So is there a second "hidden" default constructor some where else?

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

      So, to explain it as best I can:
      Every class has a default constructor. If you don't implement one on your own there will be an empty one there. Every member class variables that an object has are instantiated via default constructor when the object is instantiated, that is before the code inside of that object's constructor is ran, but after it's initializer list, unless initialized already.
      If you've hidden the constructor of the class you are initializing (by making it private or protected), or if you have member variables that are constants or reference types you have to initialize them either in the initializer list or in their declaration (doing it at declaration time doesn't allow you to pass them any parameters so be wary of that).

  • @reguret2976
    @reguret2976 5 місяців тому

    you can't initialize const and reference members without the initializer, ty for the vid very helpful :)

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

    this nice trick made me get rid of heap alloc.

  • @waiitwhaat
    @waiitwhaat 5 місяців тому

    "I don't discriminate between primitive type and class type"
    I'll cheers to that. (I code in Python)

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

    amazing, thanks

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

    Great video! Did you change the audio settings? Sounds different.

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

    I just realized his voice sounds exactly like the character Lawrence (Prince Naveed's butler) in the Disney movie, the princess & the frog.

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

    You didn't mention that you can also give the intializer list a private static function to initialize a member variable. Sometimes you need to do something more complicated than just a simple assignment. Maybe that's a new language feature in 14, 17, or 20. Dunno. You can also give it a constructor for a nested class or whatever. The initializer list is kinda clunky tbh but I feel forced to use it, but the only real downside is that when using the initializer list AND you want to use the constructor for other things to set up the class without using a secondary manually called init function, you're FORCED to implement it in the header instead of the source file so you can't hide the implementation details... holy run-on sentence, Batman. That's a weird design decision... flaw, if you ask me. Some other stuff is also weird... like you can't use a static function for array initialization in the initialization list. You. Just. Can't.

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

    what does const std::string& GetName() means? why did we put the & sign in the return type ?

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

      @Peterolen can we say that all what references do is to avoid unnecessary copies ?

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

      Wouldn’t this be an issue since any changes to the “outside” string will cause changes in the initialized class? Is the normal, copy-Val a safer option for classes?

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

    we need a series of wxwidgets :)

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

    5:55, this is so confusing. Why would it run that code before the code in the constructor?

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

      It runs the code so the variables you are assigning values to in the constructor actually exist

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

    You used this in one of your previous videos (maybe the virtual functions) and I was so damn confused .
    ps : I get it now

  • @我有一个朋友-i2u
    @我有一个朋友-i2u 4 роки тому +1

    Today's hair is also just perfect.

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

    greate video!

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

    Is this also how I should be initializing struct members variables?

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

    Thanks!

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

    Would default arguments be another way to accomplish this?

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

    wow ...gr8 explanation.....thanks a lot...

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

    Loving your videos but the room your recording in has a nasty resonance at 2kHz -4kHz, consider some acoustic dampening panels!

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

      they are 3 years old. This won't help now :P

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

    Too awesome.

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

    6:39
    What if theres another Constructor for Entity which takes Example object as a parameter , and i want to define m_Example as the Example object on the parameter.
    the code, looks like this
    Entity(Example x) : m_Example(x) {}
    Is it possible?
    Or is it gonna throw error instead?
    If it is possible, what if the Example class also has constructor that takes Example object as it parameter ( Example(Example e) {} ) ?

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

    What is the downside of initializing a variable in the header instead of the constructor especially for the primitive data types?

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

    You forgot to mention initializer lists usage with inheritance (calling a superclass constructor)

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

    Doesn't "... :m_Example(Example(8)) ..." Implicitly use the copy constructor? It hasn't been overloaded with a cout so it doesn't appear in the terminal.

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

    I've watched many C++ Tutorials now and this one is far the best! :P I'm still wondering what the three access operators mean (dot, colon and arrow). Maybe that's a good topic for a tutorial ;)

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

      Dot is accessing members of an object eg
      Dog d;
      dog.age = 10;
      Arrow is for dereferencing a pointer, aka accessing the variable the pointer is pointing to.
      Dog dog1;
      Dog* pDog = &dog;
      pDog->bark();//Calls bark on the "dog1" object
      Colon is for accessing classes and functions inside of a namespace, or static variables and functions in classes, or for defining member functions and defining static class variables.

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

      Hopson wow, quick and brief. Thanks :)

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

      @@Hopsonn Little nitpicking:
      Arrow does not dereference the pointer and access the variable it points to, rather it does that *then* accesses a *member* (or method) of that variable it points to. So technically two operation in one, thus the variable should be of a type with members (or methods), eg. class, struct.
      So to be consistent with your first example:
      Dog is a class or struct instance:
      Dog d;
      d.age = 10;
      d2 is a pointer to a Dog instance:
      Dog *d2 = &d;
      d2->age = 11;
      // this arrow op. is just a nicer, shorter form of this:
      (*d2).age = 11;
      These last two lines does exactly the same.
      So a simple dereferencing of d2 is useful to get the Dog instance it points to, without accessing it's member. It is *d2, for example
      Dog d3 = Dog(*d2);
      Executing all the above, you'll end up with
      2 distinct Dog instances, d and d3
      d2 is just a pointer to d
      d.age is overwritten to 11 trough the pointer.
      d3 is copied from where d2 points to, so from d, thus d3.age is also 11.

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

    caption really says, hey little guys my name is a cheddar.
    NOOooOoOoo

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

    in short, constructors assign the variables to a new value while member initialiser list simply initialise them

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

      Good summary

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

    Thanks a lot sir

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

    Thanks 😊 🙏🌹❤️

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

    why do you pass it in by reference into the constructor?