88

在 C++ 类中,为什么在右大括号后面加上分号?我经常忘记它并得到编译器错误,因此浪费了时间。对我来说似乎有些多余,这不太可能。人们真的会做这样的事情吗:

class MyClass
{
.
.
.
} MyInstance;

我从结构和枚举的 C 兼容性的角度得到它,但由于类不是 C 语言的一部分,我猜想主要是为了保持相似声明结构之间的一致性。

我所寻找的更多的是与设计原理相关,而不是能够改变任何东西,尽管一个好的代码完成 IDE 可能会在编译之前捕获这一点。

4

8 回答 8

78

@MichaelHaren 提供的链接似乎提供了根本原因。分号(正如其他人指出的那样)是从 C 继承的。但这并不能解释为什么 C 首先使用它。讨论包括一个例子的宝石:

struct fred { int x; long y; }; 
main() 
{ 
  return 0; 
} 

除非另有声明,否则旧版本的 C 具有来自函数的隐式 int 返回类型。如果我们省略;结构定义末尾的 ,我们不仅定义了一个新的 type fred,而且还声明了main()它将返回一个fred. 即代码将被解析如下:

struct fred { int x; long y; } main()
{ 
  return 0; /* invalid return type, expected fred type */
} 
于 2014-05-22T14:53:57.093 回答
52

语言要求类型声明中右大括号后的分号。从 C 的最早版本开始就是这样。

是的,人们确实做了你刚才放在那里的声明。它对于在方法内部创建作用域类型很有用。

void Example() {
  struct { int x; } s1;
  s1.x = 42;

  struct ADifferentType { int x; };
}

在这种情况下,我认为很清楚为什么需要分号。至于为什么在头文件中声明的更一般情况下需要它,我不确定。我的猜测是它是历史性的,并且这样做是为了使编写编译器更容易。

于 2009-04-24T12:50:58.010 回答
17

我想这是因为类是声明,即使它们需要大括号进行分组。是的,有一个历史论点,因为在 C 中你可以做到

struct
{
  float x;
  float y;
} point;

class您应该在 C++ 中能够做类似的事情,声明以相同的方式表现是有意义的。

于 2009-04-24T12:51:40.130 回答
11

它的简称

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here

类声明的花括号后面的分号实际上是多余的,但它是 C++ 的定义方式。变量声明后的分号总是需要的并且是有意义的。

于 2009-04-24T12:52:33.793 回答
5

我不使用这样的声明

class MyClass
{
.
.
.
} MyInstance;

但是在这种情况下,我可以理解为什么那里有分号。
因为它就像int a;- 变量声明。

可能是为了保持一致性,因为您可以省略 'MyInstance' 分号留在那里。

于 2009-04-24T12:53:45.240 回答
3

出于兼容性原因,在 a 之后需要它struct,您希望这样:

struct MyStruct { ... };
class  MyClass  { ... }    //inconsistency
于 2009-04-24T14:30:27.943 回答
3

在 C/C++ 中;是语句终止符。所有语句都以 ; 结尾 避免歧义(并简化解析)。语法在这方面是一致的。即使一个类声明(或任何块)是多行长并且用 {} 分隔它仍然只是一个语句({ } 是语句的一部分)因此需要以 ; 终止 ( ; 不是分隔符/定界符)

在你的例子中

class MyClass{...} MyInstance;

是完整的陈述。可以在单个语句中定义声明类的多个实例

class MyClass{...} MyInstance1, MyInstance2;

这与在单个语句中声明原始类型的多个实例完全一致:

int a, b, c;

人们不经常看到这样的类和实例声明的原因是实例只能?是一个全局变量,除非它们是静态和/或普通旧数据结构,否则您并不经常需要全局对象。

于 2009-04-25T08:00:56.497 回答
0

我们可以定义一个class something {...}accum, trans;where accum 和 trans 可以是类的两个对象something。因此,在类之后声明我们使用semi-colon的类的对象。

于 2021-11-29T15:56:56.363 回答