MQL5 El compilador no distingue entre una clase y un puntero a ella - página 4

 

que son equivalentes

    a =b;
    b =a;
 
SemenTalonov:

que son equivalentes.

Olvida esa atribución por completo.

 
Dmitry Fedoseev:

Olvídate por completo de esta tarea.

Así que no soy yo quien debe olvidarse, es el compilador el que no debe permitirte escribirlo así.

¡Y por el momento no sólo compila sino que se ejecuta sin errores!

 
SemenTalonov:

Así que no soy yo el que tiene que olvidarse, es el compilador el que no debe permitir que se escriba así.

¡Y por el momento no sólo compila sino que se ejecuta sin errores!

El compilador lo permite porque se puede, si se sabe lo que se hace.

 
class A
{
public:
    int iValue;
    A(){Print("++");}
   ~A(){Print("--");}
};
//......................
A m_A[2];

void OnStart()
{
A a;

    m_A[0] =a; 
    m_A[1] = new A();
}

Ejecute y vea cuántas veces y cuándo se llama al constructor y al destructor.

m_A[0]=a; en este caso es igual a: m_A[0].iValor=a.iValor;

new A(), en este caso, crea un nuevo objeto, llamémoslo temp y ocurre lo siguiente: m_A[1].iValue=temp.iValue;

 
Vladimir Simakov:

Ejecute y vea cuántas veces y cuándo se llama al constructor y al destructor.

m_A[0]=a; en este caso es igual a: m_A[0].iValor=a.iValor;

La segunda línea de este ejemplo es incorrecta

m_A[1] = new A();

No se puede guardar un puntero en un objeto. El compilador simplemente no lo nota.

 
SemenTalonov:

La segunda línea de este ejemplo no es correcta

No se puede guardar un puntero en un objeto. Y el compilador no lo nota.

Vuelve a leer mi post.
 
Vladimir Simakov:

Ejecute y vea cuántas veces y cuándo se llama al constructor y al destructor.

m_A[0]=a; en este caso es igual a: m_A[0].iValor=a.iValor;

new A(), en este caso, crea un nuevo objeto, llamémoslo temp y ocurre lo siguiente: m_A[1].iValue=temp.iValue;

Probablemente constructor 3, destructor 2. El resto es correcto.

 
Vladimir Simakov:

y sucede lo siguiente: m_A[1].iValue=temp.iValue;

Esta es la cuarta interpretación))

Entonces, ¿por qué es necesario llamar a la supresión en la salida? ¿Para un objeto temporal?

 
SemenTalonov:

Esta es la cuarta interpretación))

Entonces, ¿por qué la salida tiene que llamar a la supresión? ¿Para un objeto temporal?

No se puede llamar en absoluto. Pura fuga de memoria.
Razón de la queja: