MQL5 Der Compiler unterscheidet nicht zwischen einer Klasse und einem Zeiger auf sie - Seite 4

 

dass sie gleichwertig sind

    a =b;
    b =a;
 
SemenTalonov:

dass sie gleichwertig sind.

Vergessen Sie diese Zuschreibung ganz.

 
Dmitry Fedoseev:

Vergessen Sie diesen Auftrag ganz und gar.

Es liegt also nicht an mir, das zu vergessen, sondern am Compiler, der es nicht zulassen sollte, dass man es so schreibt.

Und im Moment kompiliert es nicht nur, sondern läuft auch ohne Fehler!

 
SemenTalonov:

Nicht ich muss es also vergessen, sondern der Compiler, der es nicht zulassen sollte , dass es so geschrieben wird.

Und im Moment kompiliert es nicht nur, sondern läuft auch ohne Fehler!

Der Compiler erlaubt es, weil man es kann, wenn man weiß, was man tut.

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

Führen Sie das Programm aus und sehen Sie, wie oft und wann der Konstruktor und der Destruktor aufgerufen werden.

m_A[0]=a; in diesem Fall ist es gleich: m_A[0].iWert=a.iWert;

new A() erzeugt in diesem Fall ein neues Objekt, nennen wir es temp, und es geschieht Folgendes: m_A[1].iWert=temp.iWert;

 
Vladimir Simakov:

Führen Sie das Programm aus und sehen Sie, wie oft und wann der Konstruktor und der Destruktor aufgerufen werden.

m_A[0]=a; in diesem Fall ist es gleich: m_A[0].iWert=a.iWert;

Die zweite Zeile in diesem Beispiel ist falsch

m_A[1] = new A();

Sie können einen Zeiger nicht in einem Objekt speichern. Der Compiler bemerkt es einfach nicht.

 
SemenTalonov:

In diesem Beispiel ist die zweite Zeile nicht korrekt

Sie können einen Zeiger nicht in einem Objekt speichern. Und der Compiler bemerkt es nicht.

Lesen Sie meinen Beitrag noch einmal.
 
Vladimir Simakov:

Führen Sie das Programm aus und sehen Sie, wie oft und wann der Konstruktor und der Destruktor aufgerufen werden.

m_A[0]=a; in diesem Fall ist es gleich: m_A[0].iWert=a.iWert;

new A() erzeugt in diesem Fall ein neues Objekt, nennen wir es temp, und es geschieht Folgendes: m_A[1].iWert=temp.iWert;

Wahrscheinlich Konstruktor 3, Destruktor 2. Der Rest ist richtig.

 
Vladimir Simakov:

und es geschieht Folgendes: m_A[1].iWert=temp.iWert;

Dies ist die 4. Auslegung!))

Warum ist es dann notwendig, in der Ausgabe delete aufzurufen? Für ein temporäres Objekt?

 
SemenTalonov:

Dies ist die 4. Auslegung!))

Warum muss die Ausgabe dann delete aufrufen? Für ein temporäres Objekt?

Sie können ihn gar nicht anrufen. Reines Speicherleck.
Grund der Beschwerde: