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

 
Alexey Kozitsyn:
Lo que se llama 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.

¿Cómo puede un objeto llamar a un método? Un método puede ser llamado desde una función o desde otro método.

No se llama sólo a un método de la clase, sino a un método de un objeto concreto. La propia clase es una abstracción.

 
Dmitry Fedoseev:

¿Cómo puede un objeto llamar a un método? Un método puede ser llamado desde una función o desde otro método.

No se llama sólo a un método de la clase, sino a un método de un objeto específico. La propia clase es una abstracción.

Eso es lo que es tan trivial. Y un registro del tipo

obj.method();

¿Cómo se llama?

Lo estás escribiendo tú mismo:

No se llama sólo a un método de la clase, sino a un método de un objeto específico.

También se puede decir que es aceptable:

method();

¿Cómo se llama el método?

Es decir, ¿qué método se llama por?

 
@Alexey Kozitsyn:

Eso es difícil. Y una entrada como...

¿Cómo se llama eso?

Escríbelo tú mismo:

Dime que está permitido:

¿A qué llama el método?

Es decir, ¿cuál es el método utilizado para llamarlo?

Mira la situación. Tú tienes problemas, no yo. El ejemplo de Alexey te parece incorrecto, mientras que para mí es bastante claro y comprensible.

--

"Una entrada de tipo" se llama una llamada al método "método" del objeto "obj".

--

"También me dirá que tal registro es permisible" - la impresión es que usted es el que escribe sobre tal cosa.

---

El método no llama a nada. El método se llama.

 
Dmitry Fedoseev:

Mira la situación. Eres tú, no yo, quien está confundido. El ejemplo de Alexei te parece incorrecto, mientras que a mí me parece lo suficientemente claro y comprensible, no me causó ninguna duda, sino que sólo me hizo comprender.

--

"Una entrada de tipo" se llama una llamada al método "método" del objeto "obj".

--

"También me dirá que tal registro es permisible" - la impresión es que usted es el que escribe sobre tal cosa.

---

El método no llama a nada. El método se llama.

El ejemplo de Alexei es aceptable, pero no debería, en mi opinión personal, ser un ejemplo para los demás.

Verás, todavía no has respondido a mi pregunta: ¿qué inicia una llamada a un método de una clase (o de otro modo, qué invoca un método (no lo que se invoca a través de un método, sino qué/quién invoca el método en sí))?

Cualquier método. Es una pregunta simple, usted escribió un artículo para principiantes sobre POO.

Un método no llama a nada. El método se llama.

¿Con qué se llama?
 
Alexey Kozitsyn:

1. El ejemplo de Alexei es aceptable, pero no debería, en mi opinión personal, ser un ejemplo para los demás.

2. Verás, todavía no has respondido a mi pregunta: ¿qué es lo que inicializa una llamada a un método de la clase (o, en su defecto, qué es lo que invoca a un método (no lo que se invoca a través de un método, sino qué/quién invoca al propio método))?

3. cualquier método. Es una pregunta simple, usted escribió un artículo para principiantes sobre POO.

1. Proponga su propio ejemplo.

2. No hay respuesta. Porque no sé de qué estamos hablando.

3. Yo tampoco sé de qué estamos hablando.

 
void fun(){
   obj.method();
}
El método "method" del objeto "obj" es llamado desde la función "fun".
 
Dmitry Fedoseev:

1. Ofrezca su propio ejemplo.

2. No hay respuesta. Porque no sé de qué estamos hablando.

3. Yo tampoco sé de qué estamos hablando.

2. La discusión es sobre lo que llama el método de la clase (no el método estático). El método de la clase es llamado por el objeto de la clase o, de lo contrario, el objeto de la clase inicia la llamada del método de la clase, por ejemplo, esto:

obj.method();   // obj - объект класса А, method() - метод класса А

Si el método es constante, no puede modificar el objeto a través del cual fue llamado, es decir, el objeto obj. Por otro lado, se le pasa un objeto (por ejemplo, obj2):

obj.method( obj2 );

puede ser modificado si se pasa por referencia sin un modificador const. Eso es todo.

Al principio no entendí las declaraciones de los "corefeys" del foro:

Foro sobre comercio, sistemas de comercio automatizados y prueba de estrategias de comercio

¿Qué significa el modificador const después de la declaración del método?

Combinator, 2016.01.31 20:32

En C++ significa que el método no puede cambiar los miembros de la clase, excepto los miembros declarados mutables.

Como en MQL no se puede conseguir tal cosa, significa que el método no puede cambiar el objeto en principio.

O

Foro sobre comercio, sistemas de comercio automatizados y pruebas de estrategia

¿Qué significa el modificador const después de la declaración del método?

Vasiliy Sokolov, 2016.02.01 11:55

Un método constante es otro ejemplo del proverbio "intentamos hacerlo mejor, pero resultó ser lo mismo de siempre". Creo que este es un lema para C++ en absoluto. No tiene ninguna utilidad práctica, pero complica significativamente el diseño de los programas OOP, porque constantemente hay que controlar el tipo de objeto modificado (debe ser constante también).

o

¿Por qué no puede hacerlo? Todo cambia perfectamente. Y la propia redacción es incorrecta: un método constante no puede modificar los miembros de una instancia de su clase.

 
Vasiliy Sokolov:

No lo niego. Sharpe es, en efecto, una lengua perfecta, grande y hermosa.

Vale, digamos que siempre puedes salirte con la tuya. Pero será mejor que lo expliques brevemente con un ejemplo, ¿qué da const? ¿Cuál es su verdadera utilidad? Con el ejemplo, y preferiblemente no escrito de la nada.

Una cosa es cuando escribes un proyecto para ti y todo el proyecto en miles - decenas de miles de cadenas. Otra cosa es que le des un proyecto de millones de líneas a un cliente y un Harikrishna hindú esté sentado allí sin tener ni idea. Trabajé con hindúes de Bangalore y el nivel era realmente inferior al de los nuestros.

Es como allí: se forman como programadores y se llevan al resto de sus familiares a trabajar, y puede que no sepan nada. Son gitanos.

Y si el código crítico se empaqueta en una libu, hay menos posibilidades de corrupción. Eso es lo que pienso.

 
Alexey Kozitsyn:

...

¿Por qué no puede? Todo se puede cambiar sin problemas. Y la propia redacción es incorrecta: un método constante no puede modificar los miembros de una instancia de su clase.

Esto es lo que quiero decir porque no estamos hablando del tipo en este contexto. "Clase propia" es obviamente su propia instancia (es decir, objeto).

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

El miembro_x pertenece a la misma clase que el método bar.

C obj._x - aquí el miembro _x está en una clase ajena obj.

Me parece aceptable hablar de una clase en lugar de una instancia, porque es obvio que _x pertenece a nuestra clase, que escribimos, y obj.x a la clase ajena, que manejamos.

Hablando de terminología OOP, toda la terminología aquí es un poco de eso (o incluso mucho).

 

Personalmente, siempre he entendido los métodos const como métodos que no pueden modificar las variables de la clase.

Los he utilizado muy raramente, porque a menudo me he encontrado con una situación en la que la redefinición de un método requiere cambiar algo, mientras que el método base es constante (ya se mencionó aquí).

Los métodos estáticos se utilizan mucho. En casi cualquier clase compleja. Normalmente se trata de métodos adicionales "de servicio" que no requieren acceso a las variables de la clase.

Además, para constantes como "número de segundos en un día" trato de usar una const estática, en lugar de #define. En este caso, la declaración y la inicialización de dicha constante están en lugares diferentes, pero el control de tipos se produce y me ayuda más de una vez.

Razón de la queja: