将任何类型的表达式放在 c++ 的初始化列表中在语法上是否正确?



我从教科书上看到了这个类定义:

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-decltypemem-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 }
    { }

最新更新