2012-07-07 41 views
7

El siguiente código compilado bien (sin punto y coma después de cada línea). ¿Por qué no se necesitan puntos y comas al final de cada línea en la sección pública?Punto y coma opcional en C++

Nota: poner un punto y coma después de cada línea también está bien, por lo que parece que usar punto y coma aquí es opcional.

template<typename T> 

class Accessor { 

    public: 

     explicit Accessor(const T& data) : value(data) {} 

     Accessor& operator=(const T& data) { value = data; return *this; } 
     Accessor& operator=(const Accessor& other) { this->value = other.value; return *this; } 
     operator T() const { return value; } 
     operator T&() { return value; } 

    private: 

     Accessor(const Accessor&); 
     T value; 
}; 
+0

Estas declaraciones son definiciones de funciones (métodos). No necesita poner ';' después del cuerpo de una función. –

+0

Echa un vistazo a esto: http://stackoverflow.com/questions/785686/in-c-classes-why-the-semi-colon-after-the-closing-brace – Jack

+0

IIRC, '-pedantic' en GCC se queja si ponga un punto y coma después de una definición de función. – chris

Respuesta

1

Usted no tiene que poner un punto y coma después del paréntesis de cierre de una declaración de método. En la mayoría de los códigos que he visto no hay tal punto y coma.

+0

Esto no es correcto, si se omite un punto y coma antes de main(), no se compilará. –

+0

¿Qué quieres decir antes de main()? ¿Se refiere a un main() en el mismo archivo, después de la declaración de clase? – davidrac

+0

sí. Me refiero a un main() en el mismo archivo, después de la declaración de clase. –

0

Porque las reglas de C++ no requieren un punto y coma después de } en declaraciones de funciones/métodos.

+0

final de corchetes generalmente denotan el final de una sección, como el final de una declaración de clase; por lo tanto, si a esto le sigue la función main() sin un punto y coma después de la última instrucción de clase, el compilador no se compilará. –

6

Tu código es correcto. Así es cómo funciona el lenguaje; no necesita punto y coma después del cuerpo de una implementación de método/función.

Si agrega los puntos y comas, nada malo sucede porque una instrucción vacía con un punto y coma es como una operación no operativa. Por ejemplo, x += y;; es legal C++.

10

No necesita punto y coma después de una definición de método.

La razón se necesita un punto y coma después de una definición de clase es que se puede declarar instancias de la clase justo después de la definición:

class X 
{ 

} x; 

//x is an object of type X 

Para el método, obviamente, este argumento no se sostiene, por lo que sería un punto y coma ser redundante (aunque legal).

+0

+1. Buena explicación. Entonces es una razón real para que clase/struct y enums requieran a; después del corchete :) – Jack

+0

¿Qué pasa cuando omite el punto y coma después de Accessor (const Accesor &) ¿No es este un método? si omitimos el punto y coma, el compilador no compilará. –

+1

@ZzzZz Esa es una declaración de función miembro que debe definirse en algún lugar del programa. mientras que los otros, como se menciona en mi respuesta, son definiciones de función miembro escritas dentro de la clase. –

1

Para que quede claro,

explicit Accessor(const T& data) : value(data) {} 

es equivalente a

explicit Accessor(const T& data) 
:value(data) // initializer list 
{ 
} 

¿Qué es una definición de la función miembro. A continuación poner un punto y coma al final de la firma de la función hace que sea una declaración de función miembro de que necesita ser definido en alguna parte del programa fuera de la clase, como a continuación

Accessor::Accessor(const T& data) 
{ 
    // some code 
} 

Además, como la otra respuesta sugiere, el fin de un cuerpo de función no requiere un punto y coma después de la llave de cierre (al final de las definiciones de clase o estructura sí lo requieren) pero agregar una al final no va a hacer la diferencia, ya que se considera no operativa y es la razón por la que puede agregar punto y coma al final.

Cuestiones relacionadas