Qué significa el modificador const después de una declaración de método - página 4

 
Dmitry Fedoseev:
No es el tuyo, sino uno totalmente ajeno con el mismo tipo.

¿Qué no es tuyo? ¿Que el tipo es el mismo?

¿Estás diciendo que un método constante no puede cambiar la clase de otro?

Y cuando respondas, por favor, sé más específico, no entendí lo que querías decir.

 
Alexey Kozitsyn:

¿Qué no es tuyo? ¿Que el tipo es el mismo?

¿Estás diciendo que un método constante no puede cambiar la clase de otro?

Y cuando responda, por favor, sea más explícito, no he entendido lo que quiere decir.

Eres tú quien está escribiendo incomprensiblemente Puede cambiar la clase de otra persona de cualquier tipo y del mismo tipo que ella.
 

En pocas palabras. En un método constante, es imposible cambiar los valores de las variables declaradas en la misma clase donde se encuentra el método constante (o declaradas en su padre). ¿Es así?

 
Dmitry Fedoseev:
Usted es el que no entiende lo que está escribiendo Puede cambiar la clase de otra persona de cualquier tipo y lo mismo que a sí mismo.

Tal vez deberías vigilar lo que escribes después de todo. ¿Cómo puede un método modificar una clase? ¿Tal vez un objeto de clase?

Y la pregunta estaba en la declaración:

Un método constante no puede modificar los miembros de su clase.

Alexey dio un ejemplo de que puede cambiar, así que no creo que la afirmación sea correcta, quería escuchar el comentario de Vasiliy.

 
Alexey Kozitsyn:

Tal vez deberías vigilar lo que escribes después de todo. ¿Cómo puede un método modificar una clase? ¿Tal vez un objeto de clase?

Y la pregunta estaba en la declaración:

Alexey dio un ejemplo de que puede cambiar, por lo que creo que la declaración es incorrecta, quería escuchar el comentario de Vasily.

¿Qué tal si lees con más detenimiento? -"cambiar los valores de las variables declaradas"

¿Cómo puedes hablar de la afirmación de Alexey? No se limitó a afirmarlo, lo confirmó de verdad, dio un ejemplo, puedes lanzarlo en un editor y ver cuándo se compila y cuándo no.

 
Dmitry Fedoseev:

En pocas palabras. En un método constante, es imposible cambiar los valores de las variables declaradas en la misma clase donde se encuentra el método constante (o declaradas en su padre). ¿Es así?

No. Sabes que cada objeto de una clase tiene su propio conjunto de variables declaradas en esta clase, ¿verdad? Y un método constante no puede cambiar sólo el objeto (es decir, el conjunto) desde el que fue llamado.
 
Alexey Kozitsyn:

Tal vez deberías vigilar lo que escribes después de todo. ¿Cómo puede un método modificar una clase? ¿Tal vez un objeto de clase?

..

Así:

    void bar(X& obj) const 
    {
        obj._x = 42; // OK! obj передается по ссылке и не имеет модификатора const
}

 
Alexey Kozitsyn:
No. Sabes que cada objeto de una clase tiene su propio conjunto de variables declaradas en esa clase, ¿verdad? Y un método constante no puede cambiar sólo el objeto (es decir, el conjunto) desde el que fue llamado.
¿Qué tiene que ver la llamada con esto? Lo que importa es la ubicación del método y las variables. Si el método y las variables se encuentran en la misma clase, no se puede cambiar. Si la clase se pasa por referencia como parámetro, se puede.
 
struct X
{

int _x, _y;
    
void foo() const 
    {
        _x = 42; // ERROR! метод объявлен, как const, не можем менять члены 
        _y = 42; // ERROR! 
    }

    void bar(Z& obj) const 
    {
        obj._x = 42; // OK! obj передается по ссылке и не имеет модификатора const
        _x = 42; // ERROR!
    }

    void bar(Z const& obj) 
    {
        obj._x = 42; // ERROR! obj передается по ссылке, как const
        obj._y = 42; // ERROR! obj передается по ссылке, как const
        _x = 42; // OK! метод объявлен без const на сонце
    }

   
};
Eso tiene más sentido.
 
Dmitry Fedoseev:
¿Qué tiene que ver la llamada? Lo que importa es la ubicación del método y las variables. Si el método y las variables se encuentran en la misma clase, no se puede cambiar. Si la clase se pasa por referencia como parámetro, se puede.
El desafío aquí es que si el objeto1 de la clase A llama a un método constante de la clase A, entonces ese método no puede cambiar ese objeto1 (es decir, el objeto1 que lo llamó). Sin embargo, si el objeto1 es pasado por referencia al mismo método constante, pero llamado desde el objeto2 de la clase A, entonces el objeto1 puede ser cambiado. El objeto 2, por su parte, no puede.