2009-04-24 19 views
62

Disculpas de antemano por lo que es probablemente una pregunta estúpida, pero en las clases de C++, ¿por qué el punto y coma después de la llave de cierre? Normalmente lo olvido y obtengo errores de compilación, y por lo tanto, pierdo tiempo. Me parece algo superfluo, lo cual es poco probable que sea el caso. ¿La gente realmente hacen cosas comoSemi Colón después de la clase declaración llaves

class MyClass 
{ 
. 
. 
. 
} MyInstance; 

Editar: lo entiendo desde el punto de vista de estructuras y enumeraciones de compatibilidad C, pero ya que las clases no son parte del lenguaje C que supongo que es principalmente allí el torreón coherencia entre construcciones de declaración 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 compilación.

+4

Esto podría ayudar: http://www.cpptalk.net/confused-about-the-meaning-of-the-semicolon-vt11965.html –

+0

@ Michael, gracias para el enlace. Desde una perspectiva histórica, tiene sentido, y si C++ permite que todas las gramáticas de C y las clases de C++ sean sinónomas con las estructuras, nos quedamos con el punto y coma necesario al final de la clase. –

+3

@Brian, yup serious question. Soy muy consciente de que tengo que vivir con eso, pero tengo curiosidad sobre los fundamentos del diseño y la implementación. –

Respuesta

38

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

Y sí, la gente hace de hecho la declaración que acaba 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. Mi conjetura es que es histórico y se hizo para facilitar la escritura del compilador.

+0

¿Por qué no puedo simplemente crear un tipo de ámbito sin especificar MyInstance? Se ve extraño al combinar dos acciones: declarar un nuevo tipo y declarar una nueva variable. –

+0

@Mykola puedes hacer ambas cosas. Ver la muestra que agregué – JaredPar

15

Supongo que es porque las clases son declaraciones, incluso cuando necesitan llaves para la agrupación. Y sí, está el argumento histórico que, dado que en C que podría hacer

struct 
{ 
    float x; 
    float y; 
} point; 

se debe en C++ ser capaz de hacer una cosa similar, que tiene sentido para la declaración class se comporte de la misma manera.

7

Es la abreviatura de

class MyClass 
{ 
. 
. 
. 
}; 

// instance declaration 
MyClass MyInstance; // semicolon here 

El punto y coma después de las llaves de la declaración de clase es en realidad una exageración, pero es como se define en C++. El punto y coma después de la declaración de la variable siempre es necesario y tiene sentido.

+0

Entonces, ¿necesita C++ un punto y coma después de cada declaración? –

+0

Tenga en cuenta que, de esta manera, no puede crear un objeto de una clase anónima, mientras que puede hacerlo de otra manera. – Kevin

2

No consumo tales declaraciones

class MyClass 
{ 
. 
. 
. 
} MyInstance; 

Pero en este caso puedo entender por qué está allí y coma.
Porque es como int a; - declaración de variable.

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

2

Se necesitaba después de un struct por razones de compatibilidad, y cómo le gustaría que esta:

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

En C/C++ de la; es un terminador de declaración. 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 declaración de clase (o cualquier bloque) tiene múltiples líneas y es delimitada con {}, es simplemente una declaración (el {} es parte de la declaración) por lo tanto, debe terminarse; (El; no es un separador/delimitor)

En su ejemplo

class MyClass{...} MyInstance; 

es la declaración completa. Se podría definir varias instancias de la clase declarada en una sola instrucción

class MyClass{...} MyInstance1, MyInstance2; 

Esto es completamente consistente con declarar varias instancias de un tipo primitivo en una sola instrucción:

int a, b, c; 

La razón uno no lo hace a menudo vemos tal desclave de clase e instancia, ¿la instancia podría? ¿solo? ser una variable global, y realmente no quiere objetos globales a menos que sean estructuras estáticas y/o datos antiguos sin formato.

+0

Pero la definición de función también es una afirmación pero sin punto y coma. –

39

El link proporcionado por @MichaelHeran parece proporcionar 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 un ejemplo:

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

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

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

Esta debería ser la respuesta aceptada. – nikoliazekter

Cuestiones relacionadas