MQL5 Le compilateur ne fait pas la distinction entre une classe et un pointeur vers celle-ci - page 4

 

qu'ils sont équivalents

    a =b;
    b =a;
 
SemenTalonov:

qu'ils sont équivalents.

Oubliez complètement cette attribution.

 
Dmitry Fedoseev:

Oubliez complètement cette mission.

Ce n'est donc pas moi qui devrais oublier, c'est le compilateur qui ne devrait pas vous permettre de l'écrire de cette façon.

Et en ce moment, non seulement il compile, mais il fonctionne sans erreur !

 
SemenTalonov:

Ce n'est donc pas moi qui dois oublier, c'est le compilateur qui ne devrait pas permettre qu' il soit écrit de cette façon.

Et en ce moment, non seulement il compile, mais il fonctionne sans erreur !

Le compilateur le permet parce que vous le pouvez, si vous savez ce que vous faites.

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

Exécutez et voyez combien de fois et quand le constructeur et le destructeur sont appelés.

m_A[0]=a ; dans ce cas, il est égal à : m_A[0].iValue=a.iValue ;

new A(), dans ce cas, crée un nouvel objet, appelons-le temp et ce qui suit se produit : m_A[1].iValue=temp.iValue ;

 
Vladimir Simakov:

Exécutez et voyez combien de fois et quand le constructeur et le destructeur sont appelés.

m_A[0]=a ; dans ce cas, il est égal à : m_A[0].iValue=a.iValue ;

La deuxième ligne de cet exemple est incorrecte

m_A[1] = new A();

Vous ne pouvez pas enregistrer un pointeur dans un objet. Le compilateur ne le remarque tout simplement pas.

 
SemenTalonov:

La deuxième ligne de cet exemple n'est pas correcte

Vous ne pouvez pas enregistrer un pointeur dans un objet. Et le compilateur ne le remarque pas.

Relisez mon message.
 
Vladimir Simakov:

Exécutez et voyez combien de fois et quand le constructeur et le destructeur sont appelés.

m_A[0]=a ; dans ce cas, il est égal à : m_A[0].iValue=a.iValue ;

new A(), dans ce cas, crée un nouvel objet, appelons-le temp et ce qui suit se produit : m_A[1].iValue=temp.iValue ;

Ce doit être le constructeur 3, le destructeur 2. Le reste est correct.

 
Vladimir Simakov:

et il se passe ce qui suit : m_A[1].iValue=temp.iValue ;

C'est la 4ème interprétation !))

Alors pourquoi est-il nécessaire d'appeler delete dans la sortie ? Pour un objet temporaire ?

 
SemenTalonov:

C'est la 4ème interprétation !))

Alors pourquoi la sortie doit-elle appeler delete ? Pour un objet temporaire ?

Vous ne pouvez pas l'appeler du tout. Fuite de mémoire pure.
Raison: