在 C++ 类中,为什么在右大括号后面加上分号?我经常忘记它并得到编译器错误,因此浪费了时间。对我来说似乎有些多余,这不太可能。人们真的会做这样的事情吗:
class MyClass
{
.
.
.
} MyInstance;
我从结构和枚举的 C 兼容性的角度得到它,但由于类不是 C 语言的一部分,我猜想主要是为了保持相似声明结构之间的一致性。
我所寻找的更多的是与设计原理相关,而不是能够改变任何东西,尽管一个好的代码完成 IDE 可能会在编译之前捕获这一点。
在 C++ 类中,为什么在右大括号后面加上分号?我经常忘记它并得到编译器错误,因此浪费了时间。对我来说似乎有些多余,这不太可能。人们真的会做这样的事情吗:
class MyClass
{
.
.
.
} MyInstance;
我从结构和枚举的 C 兼容性的角度得到它,但由于类不是 C 语言的一部分,我猜想主要是为了保持相似声明结构之间的一致性。
我所寻找的更多的是与设计原理相关,而不是能够改变任何东西,尽管一个好的代码完成 IDE 可能会在编译之前捕获这一点。
@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 */
}
语言要求类型声明中右大括号后的分号。从 C 的最早版本开始就是这样。
是的,人们确实做了你刚才放在那里的声明。它对于在方法内部创建作用域类型很有用。
void Example() {
struct { int x; } s1;
s1.x = 42;
struct ADifferentType { int x; };
}
在这种情况下,我认为很清楚为什么需要分号。至于为什么在头文件中声明的更一般情况下需要它,我不确定。我的猜测是它是历史性的,并且这样做是为了使编写编译器更容易。
我想这是因为类是声明,即使它们需要大括号进行分组。是的,有一个历史论点,因为在 C 中你可以做到
struct
{
float x;
float y;
} point;
class
您应该在 C++ 中能够做类似的事情,声明以相同的方式表现是有意义的。
它的简称
class MyClass
{
.
.
.
};
// instance declaration
MyClass MyInstance; // semicolon here
类声明的花括号后面的分号实际上是多余的,但它是 C++ 的定义方式。变量声明后的分号总是需要的并且是有意义的。
我不使用这样的声明
class MyClass
{
.
.
.
} MyInstance;
但是在这种情况下,我可以理解为什么那里有分号。
因为它就像int a;
- 变量声明。
可能是为了保持一致性,因为您可以省略 'MyInstance' 分号留在那里。
出于兼容性原因,在 a 之后需要它struct
,您希望这样:
struct MyStruct { ... };
class MyClass { ... } //inconsistency
在 C/C++ 中;是语句终止符。所有语句都以 ; 结尾 避免歧义(并简化解析)。语法在这方面是一致的。即使一个类声明(或任何块)是多行长并且用 {} 分隔它仍然只是一个语句({ } 是语句的一部分)因此需要以 ; 终止 ( ; 不是分隔符/定界符)
在你的例子中
class MyClass{...} MyInstance;
是完整的陈述。可以在单个语句中定义声明类的多个实例
class MyClass{...} MyInstance1, MyInstance2;
这与在单个语句中声明原始类型的多个实例完全一致:
int a, b, c;
人们不经常看到这样的类和实例声明的原因是实例只能?是一个全局变量,除非它们是静态和/或普通旧数据结构,否则您并不经常需要全局对象。
我们可以定义一个class something {...}accum, trans;
where accum 和 trans 可以是类的两个对象something
。因此,在类之后声明我们使用semi-colon
的类的对象。