课后申报括号后的半冒号

提前道歉可能是一个愚蠢的问题,但在C + +类,为什么在分号后的分号? 我经常忘记它,并得到编译器错误,从而失去了时间。 对我来说似乎有点多余,这是不太可能的。 人们是否真的这样做

class MyClass { . . . } MyInstance; 

编辑:我从C兼容的angular度来看它的结构和枚举,但由于类不是C语言的一部分,我猜它主要是在类似的声明结构之间保持一致。 我一直在寻找更多的devise原理,而不是能够改变任何东西,尽pipe一个好的代码完成IDE可能会在编译之前对其进行修改。

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

是的,人们确实做了你刚刚摆在那里的声明。 这对于在方法内创build有作用域的types很有用。

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

在这种情况下,我认为很明显为什么需要分号码。 至于为什么在头文件中声明更通用的情况下我不确定。 我的猜测是,它是历史性的,并且使编写器更容易编写。

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

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

除非另有声明,否则旧版本的C有一个隐式的函数返回types。 如果我们省略了; 在结构定义的最后,我们不仅定义了一个新的typesfred ,而且还声明main()将返回一个fred的实例。 即代码将被parsing如下:

 struct fred { int x; long y; } main() { return 0; /* invalid return type, expected fred type */ } 

我想这是因为类是声明,即使他们需要花括号来分组。 是的,有一个历史的说法,因为在C你可以做

 struct { float x; float y; } point; 

你应该用C ++做类似的事情, class声明的行为也是一样的。

这是短暂的

 class MyClass { . . . }; // instance declaration MyClass MyInstance; // semicolon here 

类声明的花括号之后的分号实际上是过度的,但它是如何定义C ++的。 variables声明之后的分号总是需要和有意义的。

我不使用这样的声明

 class MyClass { . . . } MyInstance; 

但在这种情况下,我可以理解为什么在那里分号。
因为它像int a; – variables声明。

可能为了一致,你可以省略“MyInstance”分号留在那里。

出于兼容性的原因,在struct之后需要它,以及如何使用这个结构:

 struct MyStruct { ... }; class MyClass { ... } //inconsistency 

在C / C ++中; 是一个声明终结者。 所有语句都以 避免模​​糊(并简化parsing)。 语法在这方面是一致的。 尽pipe类声明(或任何块)是多行,并用{}分隔,但它仍然是一个声明({是声明的一部分),因此需要终止; (该;不是分隔符/分隔符)

在你的例子中

 class MyClass{...} MyInstance; 

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

 class MyClass{...} MyInstance1, MyInstance2; 

这与在一个语句中声明一个基本types的多个实例完全一致:

 int a, b, c; 

人们不经常看到类和实例的这种解释的原因是,这个实例可能只是? 是一个全局variables,除非它们是静态和/或普通旧数据结构,否则你并不经常需要全局对象。