我从教科书上看到了这个类定义:
class Smiley : public Circle { // use the circle as the base for a face public:
Smiley(Point p, int r) : Circle{p,r}, mouth{nullptr} { }
我对构造函数的初始化列表有疑问。Circle{p,r}
部分应该是关于构造一个基对象,它看起来不像你放在初始化列表中的东西。这是否意味着您可以在初始化列表中放置任何类型的表达式?
Circle{p,r} 部分应该是关于构造一个基本对象
正确。
看起来不像您放在初始化列表中的内容
不管它看起来是什么样子,成员初始化器列表都是初始化基子对象的地方。尽管它的名字中有成员。从技术上讲,子对象初始化器列表将是更准确的名称。
这是否意味着您可以在初始化列表中放置任何类型的表达式?
不;目前还不清楚你最终会如何得出这样的结论。成员初始化器列表的语法如下:
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
如果mem-initializer-id
class-or-decltype
,mem-initializer
是针对基地的,如果是identifier
则用于成员。
在表达式列表中,您也不能放置任意种类的表达式。语法是:
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 }
{ }