2008-09-08 9 views
8

dado una declaración como esta:¿Qué significa el operador const cuando se usa con un método en C++?

class A { 
public: 
    void Foo() const; 
}; 

¿Qué significa?

Google convierte a esta:

funciones miembro debe ser declarado con la palabra clave const después de ellos si pueden operar en un (esto) objeto constante. Si la función no se declara const, in no se puede aplicar a un objeto const, y el compilador dará un mensaje de error.

Pero me parece algo confuso; ¿Alguien puede ponerlo en mejores términos?

Gracias.

Respuesta

12

Considera una variación de tu clase A.

class A { 
public: 
    void Foo() const; 
    void Moo(); 

private: 
    int m_nState; // Could add mutable keyword if desired 
    int GetState() const { return m_nState; } 
    void SetState(int val) { m_nState = val; } 
}; 

const A *A1 = new A(); 
A *A2 = new A(); 

A1->Foo(); // OK 
A2->Foo(); // OK 

A1->Moo(); // Error - Not allowed to call non-const function on const object instance 
A2->Moo(); // OK 

El const palabra clave en una declaración de la función indica al compilador que la función está contractualmente obligado a no modificar el estado de A. Por lo tanto, no puede llamar a funciones que no sean const dentro de A::Foo ni cambie el valor de las variables miembro.

Para ilustrar, Foo() no podrá invocar A::SetState como se declara no const, A::GetState sin embargo está bien porque se ha declarado explícitamente const. El miembro m_nState no se puede cambiar a menos que se haya declarado con la palabra clave mutable.

Un ejemplo de este uso de const es para que las funciones 'getter' obtengan el valor de las variables miembro.

@ 1800 Información: ¡Me olvidé de mutable!

La palabra clave mutable indica al compilador que acepte modificaciones a la variable miembro que de lo contrario causaría un error de compilación. Se usa cuando la función necesita modificar el estado, pero el objeto se considera lógicamente consistente (constante) independientemente de la modificación.

+0

Excelente respuesta, muy clara y concisa. Tengo mi +1 –

1

que hará que el método para no ser capaz de alterar las variables miembro del objeto

3

Funciones con const calificador no están autorizados a modificar ninguna variables miembro. Por ejemplo:

class A 
{ 
    int x; 
    mutable int y; 

    void f() const 
    { 
     x = 1; // error 
     y = 1; // ok because y is mutable 
    } 
}; 
2

C++ objetos pueden ser declaradas const:

const A obj = new A(); 

Cuando un objeto es const, las únicas funciones miembro que se pueden llamar en ese objeto son funciones declarados const. Hacer un objeto const puede interpretarse como hacer que el objeto sea solo de lectura. Un objeto const no se puede cambiar, es decir, no se pueden cambiar los datos de los miembros del objeto. La declaración de una función de miembro const significa que la función no puede realizar ningún cambio en los miembros de datos del objeto.

+0

Err ... const * Un obj = new A(); ... Olvidó la "estrella" ... :-) – paercebal

5

Esta no es una respuesta, sólo un comentario al margen. Es altamente recomendada para declarar variables y constantes const tanto como sea posible.

  1. Esto comunica su intención a los usuarios de su clase (incluso/especialmente usted).
  2. El compilador lo mantendrá fiel a esas intenciones. - es decir, es como la documentación comprobada por el compilador.
  3. Por definición, esto evita que los cambios de estado que no esperaba y puede, posiblemente, permitirá hacer suposiciones razonables, mientras que en sus métodos.
  4. const tiene una manera divertida de propagar a través de su código. Por lo tanto, es una muy buena idea comenzar a usar const tan pronto como sea posible. Decidir comenzar const -largar tu código tarde en el juego puede ser doloroso (fácil, pero molesto).

Si está utilizando un lenguaje estático, comprueba el tiempo de compilación, es una buena idea utilizarlos al máximo ... es realmente otro tipo de prueba.

2

Dos sugeridas mejores prácticas de experiencias:

(1) declarar funciones const siempre que sea posible. Al principio, me pareció que este es solo un trabajo extra, pero luego empecé a pasar mis objetos a funciones con firmas como f (const objeto & o), y de repente el compilador barfed en una línea de F tal como o.GetAValue(), porque no marqué GetAValue como una función const. Esto puede sorprender especialmente cuando subclasifica algo y no marca su versión de los métodos virtuales como const; en ese caso, la compilación podría fallar en alguna función de la que nunca haya oído hablar y que haya sido escrita para la clase base.

(2) Evite variables variables cuando sea práctico. Una trampa tentadora puede ser permitir que las operaciones de lectura alteren el estado, por ejemplo, si está creando un objeto "inteligente" que realiza operaciones de E/S perezosas o asíncronas. Si puedes manejar esto con solo una pequeña variable mutable (como un bool), entonces, en mi experiencia, esto tiene sentido. Sin embargo, si te encuentras marcando cada variable miembro como mutable para mantener algunas operaciones const, estás derrotando el propósito de la palabra clave const. Lo que puede salir mal es que una función que piensa que no está alterando tu clase (ya que solo llama a los métodos const) invoca un error en tu código, y podría tomar un gran esfuerzo incluso darte cuenta de que este error está en tu clase, ya que el otro codificador (con razón) asume que sus datos son const porque él o ella solo está llamando a métodos const.

2

const tiene una manera divertida de propagarse a través de su código. Por lo tanto, es una muy buena idea comenzar a utilizar const tan pronto como sea posible. Decidir comenzar a construir su código tarde en el juego puede ser doloroso (fácil, pero molesto).

¡Además, usted encontrará fácilmente problemas si los métodos que deberían ser const no lo son! Esto se arrastrará a través del código también y empeorará las cosas.

Cuestiones relacionadas