resueltos programacion orientada objetos metodos funciones ejercicios ejemplos codigo clases c++ oop class const

programacion - metodos en c++



Usando ''const'' en las funciones de la clase (7)

Si esto es cierto, ¿debería usarse en todas partes, porque no quiero que NINGUNA de las variables miembro se modifique o cambie de ninguna manera?

Bueno no. A veces quieres métodos de instancia para modificar miembros. Por ejemplo, cualquier método de conjunto obviamente necesitará establecer variables, por lo que no es el caso que deba poner const en todas partes. Pero si el estado de su objeto es totalmente inmutable, primero considere si no sería mejor no tener instancias (es decir, una clase estática), y si ese no es el caso, entonces haga que todo sea const .

Esta pregunta ya tiene una respuesta aquí:

He visto muchos usos de la palabra clave const después de las funciones en las clases, así que quería saber de qué se trataba. Leí algo al respecto aquí: http://duramecho.com/ComputerInformation/WhyHowCppConst.html .

Dice que se usa const porque la función "puede intentar alterar cualquier variable miembro en el objeto". Si esto es cierto, entonces debería usarse en todas partes, porque no quiero que NINGUNA de las variables miembro se altere o cambie de ninguna manera.

class Class2 { void Method1() const; int MemberVariable1;}

Entonces, ¿cuál es la definición real y el uso de const?


El significado es que garantiza a los clientes que llaman a un miembro de la función const que el estado del objeto no cambiará. Entonces, cuando dice que una función miembro es constante, significa que no cambia ninguna de las variables miembro de los objetos durante la llamada a la función.


Es bastante inusual no querer que se modifiquen las variables miembro, pero si eso es lo que requiere su clase, entonces debe hacer que todas sus funciones miembro sean constantes.

Sin embargo, es probable que desee cambiar al menos algunos miembros:

class A { private: int val; public: A() : val(0) {} void Inc() { val++; } int GetVal() const { return val; }; };

Ahora si creo dos instancias de A:

A a1; const A a2;

Puedo decir:

a1.GetVal(); a2.GetVal();

pero solo puedo decir:

a1.Inc();

tratando de cambiar el valor de un objeto constante:

a2.Inc();

Da un error de compilación.


La palabra clave const utilizada después de un método indica que este método no modifica el objeto en el que se llama. De esta manera, este método se puede llamar en una versión constante del objeto.


Otros han respondido a la parte técnica de su pregunta sobre las funciones de miembros const, pero aquí hay una imagen más amplia, y esa es la idea de la corrección de const .

En pocas palabras, la corrección constante consiste en aclarar y aplicar la semántica de su código. Tomemos un ejemplo simple. Mira esta declaración de función:

bool DoTheThing(char* message);

Supongamos que alguien más escribió esta función y necesitas llamarlo. ¿Sabes lo que DoTheThing() hace a tu char buffer? Tal vez simplemente registra el mensaje en un archivo, o tal vez cambia la cadena. No se puede saber cuál es la semántica de la llamada con solo mirar la declaración de función. Si la función no modifica la cadena, entonces la declaración es const incorrecta.

Hay un valor práctico para hacer que sus funciones sean correctas también. Es decir, dependiendo del contexto de la llamada, es posible que no pueda llamar a funciones const-incorrectas sin algún engaño. Por ejemplo, suponga que sabe que DoTheThing() no modifica el contenido de la cadena que se le pasa, y tiene este código:

void MyFunction() { std::string msg = "Hello, const correctness"; DoTheThing(msg.c_str()); }

El código anterior no se compilará porque msg.c_str() devuelve un const char* . Para poder compilar este código, deberías hacer algo como esto:

void MyFunction() { std::string msg = "Hello, const correctness"; DoTheThing(msg.begin()); }

... o incluso peor:

void MyFunction() { std::string msg = "Hello, const correctness"; DoTheThing(const_cast<char*>(msg.c_str())); }

ninguno de los cuales, posiblemente, son ''mejores'' que el código original. Pero debido a que DoTheThing() fue escrito de una manera incorrecta, tienes que doblar tu código a su alrededor.


Se puede llamar a un método const en un objeto const:

class CL2 { public: void const_method() const; void method(); private: int x; }; const CL2 co; CL2 o; co.const_method(); // legal co.method(); // illegal, can''t call regular method on const object o.const_method(); // legal, can call const method on a regulard object o.method(); // legal

Además, también le dice al compilador que el método const no debería cambiar el estado del objeto y detectará esos problemas:

void CL2::const_method() const { x = 3; // illegal, can''t modify a member in a const object }

Hay una excepción a la regla anterior utilizando el modificador modificable, pero primero debe ser bueno en la corrección constante antes de aventurarse en ese territorio.


const, cuando se adjunta a un método de clase no estático, le dice al compilador que su función no modifica el estado interno del objeto.

Esto es útil de dos maneras:

  • Si escribe código que cambia el estado interno en su método const, el compilador detecta el error, moviendo un error de programación del tiempo de ejecución al tiempo de compilación.
  • Si el código del cliente llama a un método no constante en un puntero constante, el compilador detecta el error, asegurando que se mantiene la "cadena de no cambiar las cosas".

Normalmente, desea declarar todos los métodos de clase no estática no mutantes como const. Esto permite que el código de llamada utilice el calificador const en los punteros y ayuda a detectar errores.

C ++ típico: puede declarar una variable miembro de clase "mutable" y luego cambiarla incluso desde un método const.