MQL5 Компилятор не различает класс и указатель на него - страница 4

 

то что они равнозначны

    a =b;
    b =a;
 
SemenTalonov:

то что они равнозначны

Забудьте вообще про такое присвоение.

 
Dmitry Fedoseev:

Забудьте вообще про такое присвоение.

Так это не мне надо забыть а компилятор не должен позволять так писать.

А на данный момент это не только компилируется но и выполняется без ошибок!

 
SemenTalonov:

Так это не мне надо забыть а компилятор не должен позволять так писать.

А на данный момент это не только компилируется но и выполняется без ошибок!

Компилятор позволяет потому, что можно, если понимаешь, что делаешь.

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

Запустите и посмотрите сколько раз и когда конструктор и деструктор вызываются.

m_A[0]=a; в данном случае равнозначно: m_A[0].iValue=a.iValue;

new A(), в данном слчае, создает новый объект, условно назовем его temp и происходит следующее: m_A[1].iValue=temp.iValue;

 
Vladimir Simakov:

Запустите и посмотрите сколько раз и когда конструктор и деструктор вызываются.

m_A[0]=a; в данном случае равнозначно: m_A[0].iValue=a.iValue;

В этом примере не корректна вторая строка

m_A[1] = new A();

Нельзя в объект сохранять указатель. А компилятор этого не замечает.

 
SemenTalonov:

В этом примере не корректна вторая строка

Нельзя в объект сохранять указатель. А компилятор этого не замечает.

Еще раз перечитайте мой пост.
 
Vladimir Simakov:

Запустите и посмотрите сколько раз и когда конструктор и деструктор вызываются.

m_A[0]=a; в данном случае равнозначно: m_A[0].iValue=a.iValue;

new A(), в данном слчае, создает новый объект, условно назовем его temp и происходит следующее: m_A[1].iValue=temp.iValue;

Наверно конструктор 3, деструктор 2. Остальное верно.

 
Vladimir Simakov:

 и происходит следующее: m_A[1].iValue=temp.iValue;

Это уже 4-ое толкование!))

Тогда почему на выходе требуется вызвать delete? Для объекта temp?

 
SemenTalonov:

Это уже 4-ое толкование!))

Тогда почему на выходе требуется вызвать delete? Для объекта temp?

Да не вызовешь его никак. Чистая утечка памяти.
Причина обращения: