Semi Colón después de los apoyos de statement de clase

Disculpas de antemano por lo que probablemente sea una pregunta estúpida, pero en las clases de C ++, ¿por qué el punto y coma después del corsé de cierre? Normalmente lo olvido y obtengo errores de comstackción, y por lo tanto, pierdo tiempo. Me parece algo superfluo, lo cual es poco probable que sea el caso. ¿La gente realmente hace cosas como

class MyClass { . . . } MyInstance; 

Editar: lo obtengo desde un punto de vista de compatibilidad C para estructuras y enumeraciones, pero dado que las clases no son parte del lenguaje C, creo que es principalmente la consistencia de mantener entre construcciones de statement similares. Lo que estaba buscando estaba más relacionado con la lógica de diseño en lugar de poder cambiar cualquier cosa, aunque un buen IDE de finalización de código podría atrapar esto antes de la comstackción.

El lenguaje requiere el punto y coma después de la llave de cierre en una statement de tipo. Ha sido así desde las primeras versiones de C.

Y sí, la gente sí hace la statement que acabas de poner allí. Es útil para crear tipos de ámbito dentro de los métodos.

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

En este caso, creo que está claro por qué son necesarios los puntos y comas. En cuanto a por qué es necesario en el caso más general de declarar en el archivo de encabezado, no estoy seguro. Supongo que es histórico y se hizo para facilitar la escritura del comstackdor.

El enlace provisto por @MichaelHaren parece proporcionar la causa raíz . El punto y coma (como han señalado otros) se hereda de C. Pero eso no explica por qué C lo utilizó en primer lugar. La discusión incluye esta joya de ejemplo:

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

Las versiones anteriores de C tenían un tipo de retorno int implícito de una función a menos que se declare lo contrario. Si omitimos el ; al final de la definición de la estructura, no solo definimos un nuevo tipo fred , sino que también declaramos que main() devolverá una instancia de fred . Es decir, el código se analizaría así:

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

Supongo que es porque las clases son declaraciones, incluso cuando necesitan llaves para agrupar. Y sí, está el argumento histórico de que, dado que en C podías hacer

 struct { float x; float y; } point; 

En C ++ debería poder hacer algo similar, tiene sentido que la statement de class comporte de la misma manera.

Es la abreviatura de

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

El punto y coma después de las llaves de la statement de clase es en realidad exagerado, pero así es como se define C ++. El punto y coma después de la statement de la variable siempre es necesario y tiene sentido.

No uso tales declaraciones

 class MyClass { . . . } MyInstance; 

Pero en este caso puedo entender por qué hay punto y coma allí.
Porque es como int a; – statement de variable.

Probablemente por consistencia ya que puede omitir el punto y coma ‘MyInstance’.

Se necesita después de una struct por razones de compatibilidad, y cómo le gustaría esto:

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

En C / C ++, el; es un terminador de statement. Todas las declaraciones terminan con; para evitar la ambigüedad (y simplificar el análisis). La gramática es consistente a este respecto. Aunque una statement de clase (o cualquier bloque para ese asunto) tiene múltiples líneas de longitud y está delimitada con {}, sigue siendo simplemente una statement ({} es parte de la statement) por lo tanto, debe terminarse; (El; no es un separador / delimitador)

En tu ejemplo

 class MyClass{...} MyInstance; 

es la statement completa. Uno podría definir múltiples instancias de la clase declarada en una sola statement

 class MyClass{...} MyInstance1, MyInstance2; 

Esto es completamente coherente con la statement de múltiples instancias de un tipo primitivo en una sola statement:

 int a, b, c; 

La razón por la que a menudo no se ve dicha statement de clase e instancia es que la instancia solo podría ser? ser una variable global, y realmente no quiere objetos globales a menos que sean estructuras estáticas y / o datos antiguos sin formato.