MQL5 O compilador não faz distinção entre uma classe e um ponteiro para ela - página 4

 

que eles são equivalentes

    a =b;
    b =a;
 
SemenTalonov:

que eles são equivalentes.

Esqueça totalmente essa atribuição.

 
Dmitry Fedoseev:

Esqueça completamente esta tarefa.

Portanto, não sou eu quem deve esquecer, é o compilador que não deve permitir que você o escreva dessa maneira.

E no momento não apenas compila, mas corre sem erros!

 
SemenTalonov:

Portanto, não sou eu quem precisa esquecer, é o compilador que não deve permitir que seja escrito dessa forma.

E no momento não apenas compila, mas corre sem erros!

O compilador permite isso porque você pode, se souber o que está fazendo.

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

Corra e veja quantas vezes e quando o construtor e o destruidor são chamados.

m_A[0]=a; neste caso é igual a: m_A[0].iValue=a.iValue;

novo A(), neste caso, cria um novo objeto, vamos chamá-lo de temporário e acontece o seguinte: m_A[1].iValue=temp.iValue;

 
Vladimir Simakov:

Corra e veja quantas vezes e quando o construtor e o destruidor são chamados.

m_A[0]=a; neste caso é igual a: m_A[0].iValue=a.iValue;

A segunda linha deste exemplo é incorreta

m_A[1] = new A();

Não se pode salvar um ponteiro em um objeto. O compilador simplesmente não percebe isso.

 
SemenTalonov:

A segunda linha deste exemplo não é correta

Não se pode salvar um ponteiro em um objeto. E o compilador não percebe isso.

Leia meu post novamente.
 
Vladimir Simakov:

Corra e veja quantas vezes e quando o construtor e o destruidor são chamados.

m_A[0]=a; neste caso é igual a: m_A[0].iValue=a.iValue;

novo A(), neste caso, cria um novo objeto, vamos chamá-lo de temporário e acontece o seguinte: m_A[1].iValue=temp.iValue;

Provavelmente o construtor 3, o destruidor 2. O resto está correto.

 
Vladimir Simakov:

e acontece o seguinte: m_A[1].iValue=temp.iValue;

Esta é a 4ª interpretação!))

Então por que é necessário chamar a exclusão na saída? Para um objeto temporário?

 
SemenTalonov:

Esta é a 4ª interpretação!))

Então por que a saída precisa ser excluída? Para um objeto temporário?

Não se pode chamar isso de forma alguma. Puro vazamento de memória.