为什么我必须在C++的类声明结尾处加一个分号?

Tar*_*ila 35 c++

在C++类声明中:

class Thing
{
    ...
};
Run Code Online (Sandbox Code Playgroud)

为什么我必须包括分号?

Joh*_*ohm 96

完整的语法基本上是

NAME {constituents}个实例;

其中"constituents"是类元素和方法的序列,"instances"是以逗号分隔的类实例列表(即对象).

例:

class FOO {
  int bar;
  int baz;
} waldo;
Run Code Online (Sandbox Code Playgroud)

声明类FOO和对象waldo.

实例序列可能为空,在这种情况下,您可能只有

class FOO {
  int bar;
  int baz;
};
Run Code Online (Sandbox Code Playgroud)

您必须将分号放在那里,以便编译器知道您是否声明了任何实例.

这是C兼容性的东西.

  • 甚至不需要名称或成分:`class {} waldo;`是合法的. (12认同)

jk.*_*jk. 18

因为你可以选择声明对象

class Thing
{
    ...
}instanceOfThing;
Run Code Online (Sandbox Code Playgroud)

由于历史原因

  • +1用于说出历史原因而不是向后兼容性.这个特色只是为了取悦老歌! (4认同)

Ash*_*ain 5

一个很好的规则可以帮助您记住在哪里放置分号:

  • 如果是定义,则末尾需要一个分号。类、结构和联合都是编译器的信息,因此需要尾随 ; 标记没有声明的实例。
  • 如果它包含代码,则末尾不需要分号。If 语句、for 循环、while 循环和函数包含代码,因此不需要尾随 ;。

命名空间也不需要尾随分号,因为它们可以包含上述两者的混合(因此可以包含代码,因此不需要分号)。


Dig*_*oss 5

这就是为什么...

int a,b,c,d;
int main(void) {
    struct y {
  }; a, b, c, d;
    struct x {
  } a, b, c, d;
}
Run Code Online (Sandbox Code Playgroud)

两种不同的语句,两种完全不同的含义,都是合法的C/C++,唯一的区别是;struct声明之后的内容。

a, b, c, d;在这种情况下,该语句本身仅计算abcd在这种情况下,这没有任何作用。

但是,如果它位于结构/类定义之后(在 之前);,它将创建所创建的结构/类的 4 个实例,abcd