【问题标题】:Why must I put a semicolon at the end of class declaration in C++?为什么我必须在 C++ 中的类声明末尾加上分号?
【发布时间】:2009-11-23 14:31:39
【问题描述】:

在 C++ 类声明中:

class Thing
{
    ...
};

为什么我必须包含分号?

【问题讨论】:

  • 这些很难回答,伙计们。

标签: c++


【解决方案1】:

完整的语法本质上是

类名{成分}实例;

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

例子:

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

同时声明 FOO 类和一个对象 waldo。

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

class FOO {
  int bar;
  int baz;
};

你必须把分号放在那里,这样编译器才会知道你是否声明了任何实例。

这是一个 C 兼容性问题。

【讨论】:

  • 甚至不需要名称或组成部分:class { } waldo; 是合法的。
  • @MSalters 从技术上讲,您的示例中的“成分”是类元素和方法的空序列。它还在那里。
【解决方案2】:

因为你可以选择声明对象

class Thing
{
    ...
}instanceOfThing;

历史原因

【讨论】:

  • +1 因为历史原因而不是向后兼容。这个功能只是为了取悦老歌!
【解决方案3】:

帮助您记住分号放置位置的好规则:

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

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

【讨论】:

    【解决方案4】:

    这就是为什么...

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

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

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

    但是,如果它在结构/类定义之后(; 之前),它会创建 4 个已创建结构/类的实例,a、b、c 和 d

    【讨论】:

      【解决方案5】:

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

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

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

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

      然后main 返回一个整数。

      【讨论】:

      • C++ 语言没有“隐式 int”规则。您的第二个变体完全不正确。
      【解决方案6】:

      因为语言语法是这么说的……

      【讨论】:

      • 你会得到你的第一个很好的答案徽章... :)
      • 为什么要投票?为什么天空是蓝色的? ...因为它不是红色的,呃!认真投票。
      • 很好的比喻,卡斯宾。不知道为什么这么多人认为这很有用。下次当您的支持者想知道为什么会这样时,只需重复该问题作为您的答案,然后就可以了!
      • @Caspin:谁能回答这个问题?它是语言设计者的选择。好的,这是另一个:为什么你必须用“end”关键字结束一个 ruby​​ 函数?除了语言设计者选择这样做之外,世上没有任何好的理由。如果您不太喜欢它,请找到另一种语言!
      • 看看约翰的回答,看看这个问题的有用答案是什么样的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-16
      • 2022-10-24
      • 2012-04-26
      相关资源
      最近更新 更多