Reputation: 10204
I came across this class definition from a textbook:
class Smiley : public Circle { // use the circle as the base for a face public:
Smiley(Point p, int r) : Circle{p,r}, mouth{nullptr} { }
I have a question about the constructor's initialization list. The Circle{p,r}
part should be about constructing a base object, which does not look like something you put in an initialization list. Does it mean that you can put any kind of expressions in the initialization list?
Upvotes: 1
Views: 80
Reputation: 238341
The Circle{p,r} part should be about constructing a base object
Correct.
which does not look like something you put in an initialization list
Regardless of what it looks like to you, the member initialiser list is the place to initialise the base sub object. Despite having member in its name. Technically, sub object initaliser list would be more accurate name.
Does it mean that you can put any kind of expressions in the initialization list?
No; It's unclear how you would end up with such conclusion. The grammar of member initialiser list is following:
ctor-initializer:
: mem-initializer-list
mem-initializer-list:
mem-initializer ... opt
mem-initializer-list , mem-initializer ... opt
mem-initializer:
mem-initializer-id ( expression-list opt )
mem-initializer-id braced-init-list
mem-initializer-id:
class-or-decltype
identifier
In case of mem-initializer-id
being class-or-decltype
, the mem-initializer
is for a base and in case of identifier
it is for a member.
Within the expression-list, you cannot put any arbitrary kinds of expressions either. The grammar is:
expression-list:
initializer-list
initializer-list:
initializer-clause ... opt
initializer-list , initializer-clause ... opt
initializer-clause:
assignment-expression
braced-init-list
braced-init-list:
{ initializer-list , opt }
{ designated-initializer-list , opt }
{ }
Upvotes: 3