I've read numerous explanations on initializing with braces:
PhoneNumber homePhone = {858, 555, 1234};
as well as
int x2 = val; // if val==7.9, x2 becomes 7 (bad)
char c2 = val2; // if val2==1025, c2 becomes 1 (bad)
int x3 {val}; // error: possible truncation (good)
char c3 {val2}; // error: possible narrowing (good)
char c4 {24}; // OK: 24 can be represented exactly as a char (good)
char c5 {264}; // error (assuming 8-bit chars): 264 cannot be
// represented as a char (good)
However, I've come across a bit of code here that I can't find an example on, perhaps I do not know the term so that I can google it:
auto ac1 = ArrayClass{};
I am used to doing
ArrayClass ac1 = new ArrayClass();
First of all is:
auto ac1 = ArrayClass{};
the same as
ArrayClass ac1 = ArrayClass{};
Secondly,
Am I only allowed to use braces if I used an initialization list in my constructor?
And lastly, if I have parameters, is the following correct?
auto ac1 = ArrayClass{1,4,"hi", true}
Thank you for your help
This style of initialization is called list-initialization. You can read more on it at http://en.cppreference.com/w/cpp/language/list_initialization.
I am used to doing
ArrayClass ac1 = new ArrayClass();
That is not correct C++ syntax. You can use:
ArrayClass* acPtr = new ArrayClass();
First of all is:
auto ac1 = ArrayClass{};
the same as
ArrayClass ac1 = ArrayClass{};
Yes, it is same.
Secondly,
Am I only allowed to use braces if I used an initialization list in my constructor?
Yes.
And lastly, if I have parameters, is the following correct?
auto ac1 = ArrayClass{1,4,"hi", true};
You can use that syntax if:
ArrayClass
has at least four members, and
the first member can be initialized using 1
, and
the second member can be initialized using 4
, and
the third member can be initialized using "hi"
, and
the fourth member can be initialized using true
, and
any other remaining members can be value initialized.
You can read more about value-initialization at http://en.cppreference.com/w/cpp/language/value_initialization.
auto ac1 = ArrayClass{};
allocates on the stack and the variable is automatically cleaned up when the stack goes away.
ArrayClass ac1 = new ArrayClass();
is invalid unless ArrayClass is typedef'd to be a pointer. Regardless, new ArrayClass() allocates memory on the heap that must be explicitly cleaned up by calling delete
on it.
auto ac1 = ArrayClass{};
the same as
ArrayClass ac1 = ArrayClass{};
yes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With