For people having trouble remembering the order in which const keyword is to be used, here's a quick tip. You have to read it backward, like the compiler does. For instance : -const int * A; ==> "A is a pointer to an int that is constant." (or, depending on how you prefer to write it) int const* A; ==> "A is a pointer to a const int" but both are the same as explained in the video. -int * const A; ==> "A is a const pointer to an int." -const int* const A; ==> "A is a const pointer to an int that is constant". EDIT : As mentionned by simo simo in the comments bellow, const int * A does not mean that A actually points to a const variable. It just means that the compiler will not allow you to modify the pointed value *through* A. for instance : int val = 10; int const * a = &val; *a = 30; //this will NOT compile, you're not allowed to modify "val" through "a". val = 30; //this will compile. Same with : int val = 10; int val2 = 30; const int * const A = &val; A = &val2; //will NOT compile : you can't modify what A points to. *A = 30; //will NOT compile : you can't modify val through A val = 30; //this will compile, val is not constant
For anyone still struggling. A good way to read these statements is from right to left. Example: const int * (pointer to an int constant), int const * (pointer to a constant int), int * const (constant pointer to an int), const int* const (constant pointer to a constant integer)
Man! I never understand this const properly. I learned everything I could find in books, lectures and other c & c++ videos on RUclips. But this is the only video that solved all of my confusion on const. Thanks a lot man.
@@thomascreel6522 That's true for all arrays. As soon as you change the size, you reassign it with a different array, so it's no longer the same array with the old size. Now, of course, const prevents that and only that.
@@cvbattum No, the number of elements in the array is immutable and you must create a new array of a different size and move the old array elements into it.
Funny short story, demonstrating all acquired Cherno-skills: I went ahead and compiled the code showed on 2:53. I wanted to see *if I could force a change to the const MAX_AGE using the a pointer* . *The code:* _const int MAX_AGE = 90;_ _int* a = new int;_ _a = (int*)&MAX_AGE;_ _*a = 85;_ _std::cout
I did the exact same thing and I had the same result but I didn't check any assembly files. Instead I took max_age in through std::cin so that its value isn't known at compile time(actually I had to input a temp variable and then assign that value to max_age because you cant directly std::cin a const variable) and then ran the program and the output was 90 90.
Personal notes: - reading backwards helps understanding what is constant - making a class method constant says that that method will not change any of the class member - defining a function outside of the class and passing class instance as a constant reference makes sure that the instance won’t change. Thus, any method in that function must be const, otherwise you get error
"const is basically sort of like a promise that you give, in which you promised that something will be constant, that is it's not going to change. However, it's just a promise and you can bypass that whole 'promise', and you can break your promise just like you can in real life." I came here to learn more about C++ but I get legit life lesson instead...
These videos are addictive. I am coding for long time and know most of it, still watching this playlist is so refreshing. I feel like exploring every details of C++ all over again and play with it. Great job @TheCherno! Your Game Engine series is also another gem engine! Big thanks
Hey, I saw just two videos and clicked the sub button , your videos are really high quality and I left with a lot of answers than questions when I finish watching . Keep up the hard work . Cheers .
"If you want both members to be pointers, you have to put the asterisk before every member" - this is why every programmer should immediately adopt my style of placing pointer asterisks on the name side instead of the type side! Then it works perfectly when you define multiple pointers on one line. Well, until you try to define a function that returns a pointer, then your asterisk doesn't know where it wants to be. "We still need to mark the method as const, but we just want to touch this variable" - a good example of when this pops up a lot is in "on demand" situations, such as load-on-demand, where an object loads its data in the background the first time it is required. In such a case, it is usually necessary to modify the object from a const situation, even though the method itself is not really the purpose of the modification, just the reason it is needed.
You are seriously the best code teacher I've seen and I bought something like fifty udemy courses.. keep the good work and combining assembly and c++ together! Its great and im learning alot even as a long time java programmer! Thank you a lot!!!
schools teach and test programming using the worse method and discouraging students so much. In my C++ course i thought about droping the class so many times bcuz of my mark, on the other side i have good understanding on C++. It never makes sense bcuz schools care for mark and never for the diamond someone got in his brain
Harold Finch because when my mother language is not English and the question in a test is a paragraph long asking to write a single line code. That’s when I start making mistakes. Programming instructors are not often found in every school
For people having trouble with the (const Entity& e), it's just that the function can't accept any instruction able to change the object (one of it's parameters) as you've set it const.
Pretty clear, thank you. It should be noted, if a global variable is declared as "const" or a variable is declared "static const", then it is placed by the linker into a non writable CODE or CONST segment. When it is written to by some pointer trickery, an access violation exception will probably happen.
You really did make me understand what const's are and how do they work, have been trying to find answer to it from so many websites and videos I can't believe I now understood it all. Really thank you so much!!
dont forget that const makes a variable local to the file. that is, only visible in the actual translation unit. you can have 2 const variables with the same name in different files and it will compile fine. so basically they re implicitly static.
/* my note of CONST Use for 3 cases */ 1. const int* a => can't modify the value store in a (address) 2. int* const a => can't modify the address which a points to 3.use in member function which promise not to modify the data member of the class => add const to all member functions which don't modify data members , since it might be const reference! p.s. add "mutable" if you want to break the promise wrap up const int* const Getter() consr {}
since people are still watching/commenting. A great example why const on member functions should be used. map[ ] operator (as in dict["key"] = value. it's sometimes (depending on the implementation of map) not const. So this dict["kye"] = value would compile and work, until it doesn't because you just inserted >value< at "kye". If you don't know the framework in&out, be const correct. This particular thing was taken from the yt-video: c++ bugs at facebook.
bro your channel is a gold mine i just started learning C++ also new to programming but your vids help alot. would love to see u do games like asteroids and snake etc with C++
0:16 Why doesn't the compiler use the fact that a variable is const for optimization? This would only work if it weren't a promise of course. An example that could be optimized: const int SCALAR = 90; int x = 2 * SCALAR * y; If the compiler knows that SCALAR is constant, it could calculate `2 * SCALAR` at compile time and would only have to do one multiplication at runtime. Or does it do that already, just by being clever and recognizing constant variables even without the const keyword?
I've been programming for years, but these details are things I largely didn't know. Now I hope I can improve my coding patterns accordingly, but still need to figure if I'm understanding everything correctly.
Thank you for all your videos! I just finished working through a C++ book, and I'm at the point where I try to make my first "thing," and I go "uh oh I still don't know anything." These videos are excellent for solidifying my understanding of things that I remember reading about, but do not yet have an instinct to know if I'm using them correctly yet in my own work.
@@kushnayak1619 I want to know the mindset that led you to write "ok" and I also want to know the mindset that led somebody to give you a like after at most 8 hours. Because I want to benefit from the law of attraction fully.
@@kushnayak1619 So I guess the answer is: You don't really want to benefit from the law of attraction. What a pity. I want to inform you that I am very cool.
@@kushnayak1619 And also, to all the other people: It looks like you are liking your own comments because you got one like again after 23 minutes. This feels like a psychological disease to me, right now :) - Correct me if I'm wrong. Plausible. Try.
In some ways the opposite is true. If you get const right in your program, you'll have to worry less about what you do with your objects. Without const it would be like having a bunch of global variables that might get changed without warning. With const, I can give you an const object and not worry about you changing it...like a map's key.
So if I understand it right, writing const before a pointer means the data at that pointer is cannot be modified, after a pointer means the pointer itself is constant but the data at that memory address can be rewritten, and both before and after makes that pointer completely read-only, you cannot redefine the pointer itself nor write to the data at the memory address it points to, that's pretty useful to know. As an experiment I wrote a # define (had to put a space between # and define to keep RUclips from treating it as a hashtag) to see if I have a solid understanding of it, if anyone is curious here's what I wrote: # define readonlyptr(T) const T* const
***EASY MENTAL MODEL TO PERMANENTLY REMEMBER THESE*** think of '*' as boundary, whatever is in contact with const is meant to be constant eg1: int const *ptr -> int const |*| ptr eg2: const int *ptr -> const int |*| ptr -> const is in contact with int only, and ptr is separated thanks to boundry '*', this means: 1. we can't modify int values 2. we can modify pointer eg3: int * const ptr; -> int |*| const ptr -> const is in contact with ptr while int is separated, this means: 1. we can't modify pointer. 2. we can modify int values. Also You can read backwards as suggested by @Jean-Nay Mar
const applies to the thing left of it. If there is nothing on the left then it applies to the thing right of it. Object * const obj; // read right-to-left: const pointer to Object Object const * obj; // read right-to-left: pointer to const Object Object const * const obj; // read right-to-left: const pointer to const Object
Question: How come we can change a const char* value? And don't even have to de-refference it? const char* example = "Some text."; example = "Some different text."; //didn't have to type * before example, and it allows us to change the value despite being an array of const chars? Thanks for all your videos! You're the best teacher I've come across on these subjects!
Thinking way back to my short time with C. Constant was a term used when using the preprocessor directive #define to name literal values. The purpose was similar to why you might use a named function rather than writeing inline statements(only need to write it or change it in one place), the question is why not simply assign the value to a variable name. The given reason was that it helped produce faster running and more compact machine code because the compiler must consider that variables are potentially ... variable and mutable at run time while constant literals don't change at run time and can be more easily handled by the compiler in the optimizing stage. Of course that book was from 1993, compiler optimizers have improved enough since that they can likely take up the slack if the programmer takes the easy route like declaring a variable when a constant literal value is the intent. And that was C89 not C++14
Really nice tutorial, I already know C++ and I just ran across this, but it still cleared a couple of things up, in terms of the mutable keyword at whatnot. I will probably keep watching these in case there is anything else I missed :) :)!!
if you are planning to work with classes, assigning objects to one another and "return" object types then the CONST keyword is one of the few things you must know. Some places where you NEED to use const copy constructor, code: {className(const className &object); } assignment =("is equal to" symbol) overloaded operator, code: {void operator=(const className &object); }
You should make some videos on specific Design Patterns, in particular (for me) the Strategy Pattern in C++. Maybe, recommend some books for learning the main Design Patterns every programmer should know ...
Thank you. Could you also introduce a little bit more about return constant, return reference and return constant with reference? I'm confused about these three things.
in a function, when should we pass as pointer and when should we pass as reference? For example the PrintEntity function could have argument (Entity *e) or (Entity &e) what should be used when
At 10:46 in the video you show that sometimes we have two versions of the same function, one marked const and one not, so obviously the non-member function can call the const version, but my question is, what on earth is the purpose of the nonconst version? When would you ever need to call an identical function not marked const?
9:50 I'm confuse, if by using a reference I can't change the contents of the class variables then what about the talk of using references instead of pointers to change variable contents? Object references can't call any function of the respective class whenever a variable of that class is changed by that function, is that it?
Only problem is that references are already "hard pointers", so "const int& *_const_* p1" doesn't work (2+ years old comment, and 4+ year old video, though for some reason I ended up here)
Here are 3 styles to create a pointer: 1) int* p1; 2) int *p2; 3) int * p3; Cherno uses first style, but I prefer third style and this video shows why I prefer it. 4) int* p1, p2; p1 will be pointer, but p2 will be just normal int variable. So it makes more sense to write it like this 5) int *p1, *p2; Now it looks more uniform. You say you will use int data, but at the same time you say that variables are pointers and don't store int value. But if you want to make pointer constant you need to write const keyword after asterisk. 6) int * const p1 = &var1, * const p2 = &var2; So if I use third style asterisk place are uniform for all variables, but first and second styles move asterisk around depending if you will declare multiple variables at same line and if you want to make pointer constant. 7) int const * const p1 = &var1;
I never knew about the const after member function usage. It is interesting, but not of much use. In the early days of c they didn't have prototypes (it was taken from C++), so if you got one argument wrong or the wrong number of args it would compile but crash at run-time. Prototypes moved the issue of wrong args from run-time to compile time, making the programmer's life a lot easier. The purpose of const is similar. It prevents you from mixing up your arguments. Additionally, it prevents you from modifying the wrong data. Const is a tool that helps the compiler point out where you made programming mistakes, preventing them from appearing at run-time. You should use const in all applicable situations. You could also use const to create different member functions with the same name, but that would be bad technique.
at 2:50 why you cast into (int*) instead of (int)? I mean sure, it doesn't compile when using (int) but *why* do we need or what's the reason of casting into an int*?
For people having trouble remembering the order in which const keyword is to be used, here's a quick tip.
You have to read it backward, like the compiler does. For instance :
-const int * A; ==> "A is a pointer to an int that is constant."
(or, depending on how you prefer to write it)
int const* A; ==> "A is a pointer to a const int"
but both are the same as explained in the video.
-int * const A; ==> "A is a const pointer to an int."
-const int* const A; ==> "A is a const pointer to an int that is constant".
EDIT :
As mentionned by simo simo in the comments bellow, const int * A does not mean that A actually points to a const variable. It just means that the compiler will not allow you to modify the pointed value *through* A.
for instance :
int val = 10;
int const * a = &val;
*a = 30; //this will NOT compile, you're not allowed to modify "val" through "a".
val = 30; //this will compile.
Same with :
int val = 10;
int val2 = 30;
const int * const A = &val;
A = &val2; //will NOT compile : you can't modify what A points to.
*A = 30; //will NOT compile : you can't modify val through A
val = 30; //this will compile, val is not constant
Jean-Nay Mar Awesome tip. Thanks :)
lol, it works out perfectly!
Great tip! Thanks.
this has to be the best explanation, awesome!
Thanks
The C in C++ stands for Cherno. I'm convinced.
you mean Charno?
What about the C in C?
@@victormamede7004 The C in C stands for C++
@@AbhishekBM it stands for C
@@chhayanksharma3926 *C
-Sorry, shouldn't question a joke :joy:-
More simply: a _const_ is like a: "if I modify this, please give an error calling me an idiot because I modified a _const_ ".
Const can be modified but in terms of constant there is no such a thing cuz it's literal...
For anyone still struggling. A good way to read these statements is from right to left. Example: const int * (pointer to an int constant), int const * (pointer to a constant int), int * const (constant pointer to an int), const int* const (constant pointer to a constant integer)
Man! I never understand this const properly. I learned everything I could find in books, lectures and other c & c++ videos on RUclips. But this is the only video that solved all of my confusion on const.
Thanks a lot man.
"C++ man ... That's how it rolls.." HAAHAHAHAH
I'm taking a upper division c++ class at uni with a really old professor who can't teach.... you're saving my life
Every programming language ever:
let's create a "constant" array
...
then change the values inside it
:^)
the size is constant
@@thomascreel6522 That's true for all arrays. As soon as you change the size, you reassign it with a different array, so it's no longer the same array with the old size. Now, of course, const prevents that and only that.
@@cvbattum No, the number of elements in the array is immutable and you must create a new array of a different size and move the old array elements into it.
@@thomascreel6522 uh... that's exaclty what the other guy said tho...
That’s why we have (tuples) in python.
Bucky teaches the cpp fundamental level, you teach the advanced one. Brilliant guys on RUclips
ah @thenewboston is indeed ol' reliable
sroentoel
Is Bucky coming back?
I Second that, also feel Master Bo Qian need a mention here, most def
I Second that, also feel Master Bo Qian need a mention here, most def
@@rajesh09ful Yes his videos are great. I think he stopped uploading sadly.
Funny short story, demonstrating all acquired Cherno-skills:
I went ahead and compiled the code showed on 2:53. I wanted to see *if I could force a change to the const MAX_AGE using the a pointer* .
*The code:*
_const int MAX_AGE = 90;_
_int* a = new int;_
_a = (int*)&MAX_AGE;_
_*a = 85;_
_std::cout
wow! that's amazing seriously! I had this doubt too, and was thinking and playing with it to understand it. So double wow and thanks haha.
its been 2 years but thats crazy
Thanks! I did the same and was confused!
puh thats is crazy and error-prone for beginners.
i have to keep that in mind, thank you
I did the exact same thing and I had the same result but I didn't check any assembly files. Instead I took max_age in through std::cin so that its value isn't known at compile time(actually I had to input a temp variable and then assign that value to max_age because you cant directly std::cin a const variable) and then ran the program and the output was 90 90.
Personal notes:
- reading backwards helps understanding what is constant
- making a class method constant says that that method will not change any of the class member
- defining a function outside of the class and passing class instance as a constant reference makes sure that the instance won’t change. Thus, any method in that function must be const, otherwise you get error
You are the best one I found so far with a clear eng accent that is able to help me learn C++. No offense to other RUclipsrs with strong accents.
These kind of details will take us countless hours to grasp from reading a book (with omission often), this is amazing.
"const is basically sort of like a promise that you give, in which you promised that something will be constant, that is it's not going to change. However, it's just a promise and you can bypass that whole 'promise', and you can break your promise just like you can in real life."
I came here to learn more about C++ but I get legit life lesson instead...
"Now let's put const everywhere"
You saved my life cherno... I love your tutorials and I would love it even more if you make 2d game tutorials in c++.
Learned a few things, and this clarified my thinking on const greatly, so thank you, sir.
These videos are addictive. I am coding for long time and know most of it, still watching this playlist is so refreshing. I feel like exploring every details of C++ all over again and play with it. Great job @TheCherno! Your Game Engine series is also another gem engine! Big thanks
Geming engine lol
The best video on the const keyword, and it's not even close. Good stuff!
Hey, I saw just two videos and clicked the sub button , your videos are really high quality and I left with a lot of answers than questions when I finish watching .
Keep up the hard work . Cheers .
"If you want both members to be pointers, you have to put the asterisk before every member" - this is why every programmer should immediately adopt my style of placing pointer asterisks on the name side instead of the type side! Then it works perfectly when you define multiple pointers on one line. Well, until you try to define a function that returns a pointer, then your asterisk doesn't know where it wants to be.
"We still need to mark the method as const, but we just want to touch this variable" - a good example of when this pops up a lot is in "on demand" situations, such as load-on-demand, where an object loads its data in the background the first time it is required. In such a case, it is usually necessary to modify the object from a const situation, even though the method itself is not really the purpose of the modification, just the reason it is needed.
you are a reason I fell in love with c++ language again, your c++ videos are simply awesome :)
You are seriously the best code teacher I've seen and I bought something like fifty udemy courses.. keep the good work and combining assembly and c++ together! Its great and im learning alot even as a long time java programmer! Thank you a lot!!!
This is how I see c++:
const *int &int const ***const const *** &const
We had something like that as questions in university, but every reasonable programmer avoids stuff like that.
Same here, when I studied C I had a test with an expression full of illogical pointers
schools teach and test programming using the worse method and discouraging students so much. In my C++ course i thought about droping the class so many times bcuz of my mark, on the other side i have good understanding on C++. It never makes sense bcuz schools care for mark and never for the diamond someone got in his brain
If you have a good understanding of C++, how can your grades be bad then?
Harold Finch because when my mother language is not English and the question in a test is a paragraph long asking to write a single line code. That’s when I start making mistakes. Programming instructors are not often found in every school
this video is the best const in C++ explanation till date i ever watched
For people having trouble with the (const Entity& e), it's just that the function can't accept any instruction able to change the object (one of it's parameters) as you've set it const.
03:28 "Now let's start adding const everywhere" - Cherno be like - let the games begin baby😂
i have been searching c++ videos in several platforms for two weeks i think i have finally found a good one
You are the best tutor on the planet .
Gold! As a longtime hobbyist programmer who's new to C++, these videos are amazingly helpful.
Absolutely the clearest explanation of const out there!
Literally amazing video, just answered all my questions about const (and more) in 12 minutes, you're a GANGSTER
Pretty clear, thank you.
It should be noted, if a global variable is declared as "const" or a variable is declared "static const", then it is placed by the linker into a non writable CODE or CONST segment. When it is written to by some pointer trickery, an access violation exception will probably happen.
As someone who's only approaching intermediate:
Ahhhh.... Wait, holy. hell. what?!?.... Okay.. What.
I feel that bro
@@Deadshot-fz5gx Me too.
You are the best!!! Really structured and easy to understand lessons!)
Very useful for any kind of the projects)
Thanks bro!
Easy to remember like this:
* const -> pointer(*) is constant(const)
const * -> constant(const) value at pointer(*)
You really did make me understand what const's are and how do they work, have been trying to find answer to it from so many websites and videos I can't believe I now understood it all. Really thank you so much!!
dont forget that const makes a variable local to the file. that is, only visible in the actual translation unit.
you can have 2 const variables with the same name in different files and it will compile fine.
so basically they re implicitly static.
/* my note of CONST
Use for 3 cases */
1. const int* a => can't modify the value store in a (address)
2. int* const a => can't modify the address which a points to
3.use in member function which promise not to modify the data member of the class => add const to all member functions which don't modify data members , since it might be const reference! p.s. add "mutable" if you want to break the promise
wrap up
const int* const Getter() consr {}
Nice summary Thank you
since people are still watching/commenting. A great example why const on member functions should be used.
map[ ] operator (as in dict["key"] = value. it's sometimes (depending on the implementation of map) not const. So this dict["kye"] = value would compile and work, until it doesn't because you just inserted >value< at "kye".
If you don't know the framework in&out, be const correct. This particular thing was taken from the yt-video: c++ bugs at facebook.
bro your channel is a gold mine i just started learning C++ also new to programming but your vids help alot. would love to see u do games like asteroids and snake etc with C++
Was really confused and this made it a whole bunch clearer, again your videos are straight to the point, and relatively easy to follow! Thanks!
0:16 Why doesn't the compiler use the fact that a variable is const for optimization?
This would only work if it weren't a promise of course.
An example that could be optimized:
const int SCALAR = 90;
int x = 2 * SCALAR * y;
If the compiler knows that SCALAR is constant, it could calculate `2 * SCALAR` at compile time and would only have to do one multiplication at runtime.
Or does it do that already, just by being clever and recognizing constant variables even without the const keyword?
I've been programming for years, but these details are things I largely didn't know. Now I hope I can improve my coding patterns accordingly, but still need to figure if I'm understanding everything correctly.
You have the best c++ tutorials in youtube dude
Comprehensive and to the point. A great tutorial. Crystal clear. Thanks a lot for your effort.
Thank you for all your videos! I just finished working through a C++ book, and I'm at the point where I try to make my first "thing," and I go "uh oh I still don't know anything." These videos are excellent for solidifying my understanding of things that I remember reading about, but do not yet have an instinct to know if I'm using them correctly yet in my own work.
You are so knowledgeable!! I don't know how I'd learn C++ without you!! 🙏🏻
Man, I start to think if I really should pledge through patreon to this series, because you are the correct one for me. INDEED.
i am on the patreon and donated . i cant thank you enough. please carry on taking video in c++ :)😀 keep up the good work
Thank you for using a dark theme with your coding examples. It makes a massive difference.
im loving these videos, i am asking if you can make a video on friend functions
Thank you so much for clearing up const's I really appreciate this series :D
dud, your knowledge exceeds the physical barrier of the realm
I really like how he does sarcasm in the middle of a serious lesson ! But I guess that's how it rolls😂
Hello for my future self, I know I'll be watching this many times in the future
Hey man, I've never seen these in-depth concepts before in my University! Many thanks for this!
I spent like 20 minutes and then looked you up🤯🤯🤯! Thanks
const bool confusion = true;
ok
@@kushnayak1619 I want to know the mindset that led you to write "ok" and I also want to know the mindset that led somebody to give you a like after at most 8 hours. Because I want to benefit from the law of attraction fully.
@@karmaindustrie ok
@@kushnayak1619 So I guess the answer is: You don't really want to benefit from the law of attraction. What a pity. I want to inform you that I am very cool.
@@kushnayak1619 And also, to all the other people: It looks like you are liking your own comments because you got one like again after 23 minutes. This feels like a psychological disease to me, right now :) - Correct me if I'm wrong. Plausible. Try.
new subscriber from india amazing teaching technique bro keep it up
daym, so much to take care of when working with const stuff..
In some ways the opposite is true. If you get const right in your program, you'll have to worry less about what you do with your objects. Without const it would be like having a bunch of global variables that might get changed without warning. With const, I can give you an const object and not worry about you changing it...like a map's key.
So if I understand it right, writing const before a pointer means the data at that pointer is cannot be modified, after a pointer means the pointer itself is constant but the data at that memory address can be rewritten, and both before and after makes that pointer completely read-only, you cannot redefine the pointer itself nor write to the data at the memory address it points to, that's pretty useful to know.
As an experiment I wrote a # define (had to put a space between # and define to keep RUclips from treating it as a hashtag) to see if I have a solid understanding of it, if anyone is curious here's what I wrote: # define readonlyptr(T) const T* const
are you ever gonna do function pointers?
Paul Leonard Boon I definitely think he should. That would be an awesome topic
I hope not, that is more a C thing.
In C++, "std::function" should be used
Why are you Guys on this playlist
This was such a good video!!! Multiple *holy shit* moments for me throughout the video. This is better than Breaking Bad ngl.
***EASY MENTAL MODEL TO PERMANENTLY REMEMBER THESE***
think of '*' as boundary, whatever is in contact with const is meant to be constant
eg1: int const *ptr -> int const |*| ptr
eg2: const int *ptr -> const int |*| ptr
-> const is in contact with int only, and ptr is separated thanks to boundry '*', this means:
1. we can't modify int values
2. we can modify pointer
eg3: int * const ptr; -> int |*| const ptr
-> const is in contact with ptr while int is separated, this means:
1. we can't modify pointer.
2. we can modify int values.
Also You can read backwards as suggested by @Jean-Nay Mar
const applies to the thing left of it. If there is nothing on the left then it applies to the thing right of it.
Object * const obj; // read right-to-left: const pointer to Object
Object const * obj; // read right-to-left: pointer to const Object
Object const * const obj; // read right-to-left: const pointer to const Object
te amo cherno acá te estamos viendo con un amigo muchas gracias!!!!
Thanks! The level of depth you go in is amazing!
Question: How come we can change a const char* value? And don't even have to de-refference it?
const char* example = "Some text.";
example = "Some different text."; //didn't have to type * before example, and it allows us to change the value despite being an array of const chars?
Thanks for all your videos! You're the best teacher I've come across on these subjects!
Thinking way back to my short time with C. Constant was a term used when using the preprocessor directive #define to name literal values. The purpose was similar to why you might use a named function rather than writeing inline statements(only need to write it or change it in one place), the question is why not simply assign the value to a variable name. The given reason was that it helped produce faster running and more compact machine code because the compiler must consider that variables are potentially ... variable and mutable at run time while constant literals don't change at run time and can be more easily handled by the compiler in the optimizing stage. Of course that book was from 1993, compiler optimizers have improved enough since that they can likely take up the slack if the programmer takes the easy route like declaring a variable when a constant literal value is the intent. And that was C89 not C++14
Really nice tutorial, I already know C++ and I just ran across this, but it still cleared a couple of things up, in terms of the mutable keyword at whatnot. I will probably keep watching these in case there is anything else I missed :) :)!!
this is a complete video I was looking for thanks sir.
I keep coming back to this video because I always forget what const means depending on its position and it's so ANNOYIIIIIINNNNGGGG
if you are planning to work with classes, assigning objects to one another and "return" object types then the CONST keyword is one of the few things you must know.
Some places where you NEED to use const
copy constructor,
code: {className(const className &object); }
assignment =("is equal to" symbol) overloaded operator,
code: {void operator=(const className &object); }
You should make some videos on specific Design Patterns, in particular (for me) the Strategy Pattern in C++. Maybe, recommend some books for learning the main Design Patterns every programmer should know ...
who the hell are these 14 people to dislike such an amazing video...........
Thanks!
Refactored my whole program at work
Can you make the video on how you type this fast in VS?
Amazing content btw !
Thank you. Could you also introduce a little bit more about return constant, return reference and return constant with reference? I'm confused about these three things.
Simple and clear explanation. Keep up the good work, friend 👍
Thanks man ..... your tutorials are very clear to follow.✌️
in a function, when should we pass as pointer and when should we pass as reference?
For example the PrintEntity function could have argument (Entity *e) or (Entity &e) what should be used when
At 10:46 in the video you show that sometimes we have two versions of the same function, one marked const and one not, so obviously the non-member function can call the const version, but my question is, what on earth is the purpose of the nonconst version? When would you ever need to call an identical function not marked const?
9:50 I'm confuse, if by using a reference I can't change the contents of the class variables then what about the talk of using references instead of pointers to change variable contents? Object references can't call any function of the respective class whenever a variable of that class is changed by that function, is that it?
Note for people using C++20 or greater: There is also 'constexpr' for explicit compile time constants.
🤓Ermm don't forget about consteval!
One of the best teachers ever!!!
Thank you Yan for your tutorials!
PS: now I can understand: const int* const Method(const int& const p1) const;
Only problem is that references are already "hard pointers", so "const int& *_const_* p1" doesn't work
(2+ years old comment, and 4+ year old video, though for some reason I ended up here)
Dude you are great!! you have really make the things very simple!!
Here are 3 styles to create a pointer:
1) int* p1;
2) int *p2;
3) int * p3;
Cherno uses first style, but I prefer third style and this video shows why I prefer it.
4) int* p1, p2;
p1 will be pointer, but p2 will be just normal int variable. So it makes more sense to write it like this
5) int *p1, *p2;
Now it looks more uniform. You say you will use int data, but at the same time you say that variables are pointers and don't store int value. But if you want to make pointer constant you need to write const keyword after asterisk.
6) int * const p1 = &var1, * const p2 = &var2;
So if I use third style asterisk place are uniform for all variables, but first and second styles move asterisk around depending if you will declare multiple variables at same line and if you want to make pointer constant.
7) int const * const p1 = &var1;
Thanks for clearly explaining ~10 contradicting concepts in 10 min ...
it is often optimized into an immediate operand in instructions and stored in text segment
"Haha, point out"
That was comedy gold
man o man you are awesome and most the programming i learnt is beacuse of you and buckey
Before video:🙄🤕
During video:🤔🤯🥰
After video:🧐
When you talk about putting the const before and after the pointer, are you talking about top/low level const?
very clear explanation
I never knew about the const after member function usage. It is interesting, but not of much use.
In the early days of c they didn't have prototypes (it was taken from C++), so if you got one argument wrong or the wrong number of args it would compile but crash at run-time. Prototypes moved the issue of wrong args from run-time to compile time, making the programmer's life a lot easier. The purpose of const is similar. It prevents you from mixing up your arguments. Additionally, it prevents you from modifying the wrong data. Const is a tool that helps the compiler point out where you made programming mistakes, preventing them from appearing at run-time. You should use const in all applicable situations. You could also use const to create different member functions with the same name, but that would be bad technique.
Great video. Could you consider doing constexpr as well?
Good explaination cherno sir
at 2:50 why you cast into (int*) instead of (int)?
I mean sure, it doesn't compile when using (int) but *why* do we need or what's the reason of casting into an int*?