Гуру, прошу пояснить новичку синтаксическую запись на mql

 

Здравствуйте, уважаемые mql-программисты.

Я изучаю документацию mql и у меня возникло непонимание следующего момента.

В https://docs.mql4.com/ru/basis/function

сказано, что

Оператор return может возвращать значение выражения, стоящего в этом операторе. Значение выражения при необходимости преобразуется к типу результата функции. Можно возвращать простые типы, простые  структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур.

В https://docs.mql4.com/ru/basis/function/operationoverload

написан такой код:

class CMatrix
  {
private:
   CRow              m_rows[];
 
public:
   //--- конструкторы и деструктор
                     CMatrix(void);
                     CMatrix(int rows)  { ArrayResize(m_rows,rows);             }
                    ~CMatrix(void){};
   //--- получение размеров матрицы
   int               Rows()       const { return(ArraySize(m_rows));            }
   int               Cols()       const { return(Rows()>0? m_rows[0].Size():0); }
   //--- возвращает значения столбца в виде строки CRow
   CRow              GetColumnAsRow(const int col_index) const;
   //--- возвращает строку со значениями матрицы  
   string            String(voidconst;
   //--- оператор индексации возвращает строку по ее номеру
   CRow *operator[](int i) const        { return(GetPointer(m_rows[i]));        }
   //--- оператор сложения
   CMatrix           operator+(const CMatrix &m);
   //--- оператор умножения
   CMatrix           operator*(const CMatrix &m);
   //--- оператор присваивания
   CMatrix          *operator=(const CMatrix &m);
  };


Смущают такие записи:

CRow              GetColumnAsRow(const int col_index) const;


CMatrix           operator+(const CMatrix &m);


CMatrix           operator*(const CMatrix &m);

Тут я чего-то никак не могу понять почему такая запись разрешена?

Вроде-как в документации сказано, что в сложных структурах и классах мы не возвращаем объект, только указатель на объект?

Научите, пожалуйста, понимать правильно записи подобного рода.

 

Можно возвращать объекты классов и сложных структур, если у них есть конструктор копирования.

 
Anton Mikheyko:
 

Вроде-как в документации сказано, что в сложных структурах и классах мы не возвращаем объект, только указатель на объект?

Научите, пожалуйста, понимать правильно записи подобного рода.

На мой взгляд, не следует никогда возвращать в функциях сложные объекты. Именно потому, что в этом случае происходит неявное копирование.

По-моему, правильнее принимать и возвращать указатели.

 

Ничего страшного в копировании объектов нет.

А вот при работе с указателями всегда стоит вопрос: кто и когда их будет освобождать.

 
Koldun Zloy:

Ничего страшного в копировании объектов нет.

А вот при работе с указателями всегда стоит вопрос: кто и когда их будет освобождать.

Не всегда стоит вопрос об освобождении. Каким образом создавали, от этого зависит, надо ли будет беспокоиться об их удалении. Но в любом случае можно пользоваться указателями.

Если бояться проблемы удаления объектов, то волков бояться - в лес не ходить. Почти вся прелесть ООП исчезает. Лучше подумать об удалении и получить все преимущества ООП.

Вот случай. когда используется указатель, но удалять ничего не надо:

#property strict

class CTest{
   private:
      int m_val;
   public:
   void set(int val){
      m_val=val;
   }
   int get(){
      return(m_val);
   }   
};

CTest c1[10];
CTest * tmp[10];


void OnStart(){

   for(int i=0;i<10;i++){
      tmp[i]=GetPointer(c1[i]);
   }
   


}
 

Я не говорил, что надо бояться указателей. Я только сказал, что не нужно бояться возвращать объекты.

А Ваш пример бессмысленный и не в тему.

 

Нужно бояться возвращать объекты, потому-что это величайшая глупость. Не страшно, но крайне тупо. Прикольно так, сначала пишешь глупость, потом начинаешь сам себе противоречить, что бы отмазаться.

Пример бессмысленный если с осмыслением сложности. Хотя, кому как, каков привет, таков и ответ.

Пример из области черного юмора для тех кто боится создавать объекты только потому-что их надо будет удалять. 

 

Может тему прочитаете для начала.

А потом приведёте хоть какие-нибудь аргументы.

Иначе говорить не о чем. 

 
Koldun Zloy:

Может тему прочитаете для начала.

А потом приведёте хоть какие-нибудь аргументы.

Иначе говорить не о чем. 

Что бы аргумент возымели силу влияния, у того, для кого аргумент предназначается, должно быть в присутствии собственное соображение. Если кто-то не рекомендует создавать объекты только от того, что надо будет думать об их удалении, то наличие соображения вызывает сомнение.

А тему прочитать - да стоило бы некоторым. Здесь никто не спрашивал, хорошо ли, плохо ли возвращать объекты, или создавать их, что бы удалять. Здесь просили пояснить код.  

 
Если не хотите читать внимательно, я Вам поясню, мне не трудно.
Топикстартер привёл пример из документации, в котором из функции возвращается объект.
Представьте себе, Метаквоты не знают, что это "величайшая глупость".
Дальше George Merts сказал "не следует никогда возвращать в функциях сложные объекты".
Именно на это я ответил что не надо бояться их возвращать.
О том что надо бояться создавать объекты я не говорил.
Ну и попробуйте применить Ваш пример к обсуждаемой теме.
 

Чем дальше, тем больше глупостей. 

Пример из документации показывает наличие тех или иных возможностей языка, документация совершено не касается вопроса целесообразности применения тех или иных возможностей.

Бояться возвращать объекты не надо, просто не надо делать глупости.  

Да, ни кто не писали, что надо бояться, был просто продемонстрирован это страх, или этакое умничание не впопад.

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