Вопросы по ООП в MQL5 - страница 44

 
Igor Makanu:

не согласен:

Пожалуйста оновите свои знания о том, что такое "оператор присвоения" и "конструктор копирования", чем они отличаются, когда и как вызываются (явно и неявно).
Желтым цветом в коде вами выделен возврат локальной переменной с функции, в результате чего вызывается дефолтный конструктор копирования (не путать с оператором присвоения).

Что такое "полный тип данных", к сожалению, не совсем ясно, как и то, что вы пытались доказать своим кодом...
Повторюсь: "дефолтный оператор присвоения в MQL возвращает тип данных void;"

struct A{
   int x,y;
};

void OnStart(){
   A a, b;
   Print(typename(a = b));   // void
}
 
Koldun Zloy:

Ошибаетесь.

Просто определите свой operator=, который возвращает this, и увидите разницу.

Увидеть это можно когда результат присваивания присваивается ещё раз.

если я определю оператор =, то уйду от своей начальной цели - вызвать дефолтный ::=

видимо вопрос не разрешимый


Sergey Dzyublik:

Что такое "полный тип данных", к сожалению, не совсем ясно, как и то, что вы пытались доказать своим кодом...

полный это полный - будет сохранена структура данных, и нет необходимости контролировать копирование структур если добавляю новые поля

 
Igor Makanu:

если я определю оператор =, то уйду от своей начальной цели - вызвать дефолтный ::=

А Вам сильно нужно такое присваивание?

b = c = a;
 
Igor Makanu:

полный это полный - будет сохранена структура данных, и нет необходимости контролировать копирование структур если добавляю новые поля

Тогда, согласно вашей терминологии, вызов дефолтного оператора присвоения может дать "неполный тип данных".
Баг от 2019.05.03 так и не был исправен: https://www.mql5.com/ru/forum/1111/page2451#comment_11556395

 
Koldun Zloy:

А Вам сильно нужно такое присваивание?

чисто в теории нужно - хотел узнать, вдруг это некая "новая сущность", а не оператор = 

для практического использования вообще не нужно, без проблем запишу в 2 оператора


Sergey Dzyublik:

Тогда, согласно вашей терминологии, вызов дефолтного оператора присвоения может дать "неполный тип данных".
Баг от 2019.05.03 так и не был исправен: https://www.mql5.com/ru/forum/1111/page2451#comment_11556395

"моя терминология" - это чтобы спросить, не имею претензий,

но смысл использования дефолтного оператора = , удобно, что описываешь только поля в структуре, а копируются все, включая  даже размерности массивов (правда только с увеличением размерности - принцип работы как  у ArrayCopy() ) 


ну раз баг, значит пока так

 

вопрос чисто теоретический:

видел, возможно в СБ, такой вызов конструктора:

class A{
public:   
   A(){Print(__FUNCTION__);}
};

class B{
public:   
   A a1,a2;
   B():a1(),a2() { Print(__FUNCTION__); }   
};

чем будет отличаться такой код:

class A{
public:   
   A(){Print(__FUNCTION__);}
};

class B{
public:   
   A a1,a2;
   B() { Print(__FUNCTION__); }   
};

распринтовал, разницы не увидел, тогда немного конкретнее - что дает или зачем можно использовать принудительный вызов конструкторов обьектов a1 и a2?

в чем "удобство" первого варианта? 

 
Igor Makanu:

вопрос чисто теоретический:

видел, возможно в СБ, такой вызов конструктора:

чем будет отличаться такой код:

распринтовал, разницы не увидел, тогда немного конкретнее - что дает или зачем можно использовать принудительный вызов конструкторов обьектов a1 и a2?

в чем "удобство" первого варианта? 

у конструкторов бывают параметры, и их надо как-то передавать

То есть пока параметров нет, разницы и не чуствуется, а вот если будет конструктор A(int arg) то совсем другой коленкор

 
Maxim Kuznetsov:

у конструкторов бывают параметры, и их надо как-то передавать

То есть пока параметров нет, разницы и не чуствуется, а вот если будет конструктор A(int arg) то совсем другой коленкор

наверное, Вы правы - в общем зависит от задач

у меня просто из-за первого варианта возникли трудности, когда захотел 2 конструктора класса В использовать - получил дублирование кода в обоих конструкторах - убрал, осталась лишь примерно та часть кода, что в первом варианте, вот и вопрос появился, где я это увидел и на кой так написал )))

 
Igor Makanu:

что дает или зачем можно использовать принудительный вызов конструкторов обьектов a1 и a2?

Корректная назва процесса не "принудительный вызов конструкторов a1 и a2", а инициализация полей класса (нестатических). 
Обязательна в случаях:

- использования константных полей класса;
- отсутствия у полей класса конструктора по умолчанию;
- отсутствия у объектов полей класса иного способа инициализации кроме как через вызов конструктора (например, удален оператор присвоения);
-...

 

А кто-нибудь объяснит, чем такая инициализация полей:

CArray::CArray(void) : m_step_resize(16),
                       m_data_total(0),
                       m_data_max(0),
                       m_sort_mode(-1)
  {
  }

лучше чем такая:

CArray::CArray(void)
  {
        m_step_resize=16;
        m_data_total=0;
        m_data_max=0;
        m_sort_mode=-1;
  }

И вообще, в чем смысл?

Причина обращения: