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

时间:2009-11-23 14:31:39

标签: c++

在C ++类声明中:

class Thing
{
    ...
};

为什么我必须加上分号?

6 个答案:

答案 0 :(得分:93)

完整语法基本上是

类NAME {constituents}实例;

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

示例:

class FOO {
  int bar;
  int baz;
} waldo;

声明类FOO和对象waldo。

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

class FOO {
  int bar;
  int baz;
};

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

这是C兼容性的事情。

答案 1 :(得分:17)

因为您可以选择声明对象

class Thing
{
    ...
}instanceOfThing;

由于历史原因

答案 2 :(得分:3)

因为它可能是下一个元素的定义。例如,从C语法中获取它:如果声明

struct { ... } main (int argc, char..

然后它假定main返回一个struct。如果有分号,

struct { ... }; main (int argc, char..

然后main返回一个int。

答案 3 :(得分:3)

这就是为什么......

int a,b,c,d;
int main(void) {
    struct y {
  }; a, b, c, d;
    struct x {
  } a, b, c, d;
}

两个不同的陈述,两个完全不同的含义,都是合法的C / C ++,唯一的区别是结构声明后的;

在此上下文中,语句a, b, c, d;本身仅评估abcd。在这种情况下,这没有任何作用。

但是,如果它正好在struct / class定义之后(在;之前),它会创建4个创建的struct / class的实例,ab,{{1} }和c

答案 4 :(得分:2)

因为语言语法是这样说的......

答案 5 :(得分:2)

帮助您记住分号放在哪里的好规则:

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

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