It's been rehashed over and over that primitive types don't have constructors.
That's right.
For example this bar is not initialized to 0 when I call Foo()
Yes it is. Foo()
specifies value-initialisation which, for class like this with no user-provided constructor, means it's zero-initialised before initialising its members. So _bar
ends up with the value zero. (Although, as noted in the comments, one popular compiler doesn't correctly value-initialise such classes.)
It would not be initialised if you were to use default-initialisation instead. You can't do that with a temporary; but a declared variable Foo f;
or an object by new F
will be default-initialised. Default-initialisation of primitive types does nothing, leaving them with an indeterminate value.
It would also not be initialised if the class had a user-provided default constructor, and that constructor didn't specifically initialise _bar
. Again, it would be default-initialised, with no effect.
So obviously int() is not a constructor. But what is it's name?
As an expression, it's a value-initialised temporary of type int
.
Syntactically, it's a special case of an "explicit type conversion (functional notation)"; but it would be rather confusing to use that term for anything other than a type conversion.
In this example I would say i
is: (constructed? initialized? fooed?)
Initialised. List-initialised (with an empty list), value-initialised, or zero-initialised, if you want to be more specific.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…