MQL5 Il compilatore non distingue tra una classe e un puntatore ad essa - pagina 4

 

che sono equivalenti

    a =b;
    b =a;
 
SemenTalonov:

che sono equivalenti.

Lasciate perdere del tutto questa attribuzione.

 
Dmitry Fedoseev:

Dimentica del tutto questo incarico.

Quindi non sono io che dovrei dimenticare, è il compilatore che non dovrebbe permetterti di scriverlo in quel modo.

E al momento non solo compila ma funziona senza errori!

 
SemenTalonov:

Quindi non sono io che devo dimenticare, è il compilatore che non dovrebbe permettere che sia scritto in quel modo.

E al momento non solo compila ma funziona senza errori!

Il compilatore lo permette perché si può, se si sa cosa si sta facendo.

 
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();
}

Esegui e vedi quante volte e quando vengono chiamati il costruttore e il distruttore.

m_A[0]=a; in questo caso è uguale a: m_A[0].iValue=a.iValue;

new A(), in questo caso, crea un nuovo oggetto, chiamiamolo temp e succede quanto segue: m_A[1].iValue=temp.iValue;

 
Vladimir Simakov:

Esegui e vedi quante volte e quando vengono chiamati il costruttore e il distruttore.

m_A[0]=a; in questo caso è uguale a: m_A[0].iValue=a.iValue;

La seconda linea in questo esempio non è corretta

m_A[1] = new A();

Non si può salvare un puntatore in un oggetto. Il compilatore semplicemente non lo nota.

 
SemenTalonov:

La seconda linea in questo esempio non è corretta

Non si può salvare un puntatore in un oggetto. E il compilatore non lo nota.

Rileggi il mio post.
 
Vladimir Simakov:

Esegui e vedi quante volte e quando vengono chiamati il costruttore e il distruttore.

m_A[0]=a; in questo caso è uguale a: m_A[0].iValue=a.iValue;

new A(), in questo caso, crea un nuovo oggetto, chiamiamolo temp e succede quanto segue: m_A[1].iValue=temp.iValue;

Questo deve essere il costruttore 3, il distruttore 2. Il resto è corretto.

 
Vladimir Simakov:

e succede quanto segue: m_A[1].iValue=temp.iValue;

Questa è la quarta interpretazione!))

Allora perché è necessario chiamare la cancellazione nell'output? Per un oggetto temporaneo?

 
SemenTalonov:

Questa è la quarta interpretazione!))

Allora perché l'output deve chiamare la cancellazione? Per un oggetto temporaneo?

Non si può chiamare affatto. Pura perdita di memoria.
Motivazione: