半冒号课后声明括号

Sma*_*acL 74 c++ oop class declaration

事先道歉可能是一个愚蠢的问题,但在C++类中,为什么在结束后的分号呢?我经常忘记它并得到编译器错误,因而浪费时间.对我来说似乎有些多余,这种情况不太可能发生.人们真的做的事情

class MyClass
{
.
.
.
} MyInstance;
Run Code Online (Sandbox Code Playgroud)

编辑:我从结构和枚举的C兼容性角度得到它,但由于类不是C语言的一部分,我想主要是在类似的声明构造之间保持一致性.我想要的是与设计原理更相关,而不是能够改变任何东西,尽管一个好的代码完成IDE可能会在编译之前捕获它.

Nat*_*han 60

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

struct fred { int x; long y; }; 
main() 
{ 
  return 0; 
} 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 是的,隐式 int 返回类型会影响这里的一切。不错的宝石 (2认同)

Jar*_*Par 43

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

是的,人们确实做了你刚刚提出的声明.它对于在方法内创建范围类型很有用.

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

  struct ADifferentType { int x; };
}
Run Code Online (Sandbox Code Playgroud)

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


unw*_*ind 17

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

struct
{
  float x;
  float y;
} point;
Run Code Online (Sandbox Code Playgroud)

你应该在C++中能够做类似的事情,class声明以相同的方式行事是有道理的.


Ste*_*ger 10

它的缩写

class MyClass
{
.
.
.
};

// instance declaration
MyClass MyInstance;  // semicolon here
Run Code Online (Sandbox Code Playgroud)

类声明的花括号之后的分号实际上是矫枉过正,但它是如何定义C++的.变量声明后的分号总是需要并且有意义.


Myk*_*yev 5

我不使用此类声明

class MyClass
{
.
.
.
} MyInstance;
Run Code Online (Sandbox Code Playgroud)

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

可能是为了保持一致性,您可以省略“ MyInstance”分号。