Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在c+中放置任何类型的表达式在语法上正确吗+';什么是初始化列表?_C++_Syntax_Constructor_Initializer List - Fatal编程技术网

C++ 在c+中放置任何类型的表达式在语法上正确吗+';什么是初始化列表?

C++ 在c+中放置任何类型的表达式在语法上正确吗+';什么是初始化列表?,c++,syntax,constructor,initializer-list,C++,Syntax,Constructor,Initializer List,我在一本教科书中找到了这个班级定义: 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}部分应该是关于构造一个基本对象的,它看起来不像是放在初始化列表中的东西。这是否意味着您可以在初始化列表中放置任何类型的表达式

我在一本教科书中找到了这个班级定义:

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}
部分应该是关于构造一个基本对象的,它看起来不像是放在初始化列表中的东西。这是否意味着您可以在初始化列表中放置任何类型的表达式

圆{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初始值设定项id
class或decltype
,则
mem初始值设定项
用于基础,如果
标识符
用于成员

在表达式列表中,也不能放置任意类型的表达式。语法是:

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

“它看起来不像是您放在初始化列表中的东西”-为什么不?在哪里初始化基?
Circle{p,r}
是对父类构造函数的“调用”(实际上不是正确的词)。它允许父类
循环
类初始化自身。您还可以将基本对象初始化放在哪里?构造函数主体太晚了。