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

 
Кстати умные указатели здесь вообще в тему.
 
A100:
А почему тогда оператор сложения (в отличии от присваивания) возвращает не указатель? Ведь "перекинул и все дела"!
Dmitry Fedoseev:
Вас действительно интересует этот вопрос, или лишь бы поговорить?

Да. Вот этот момент (о чём спросил A100) я и имел ввиду.

Тут я не могу "переварить".

Поясните, пожалуйста, как следует читать (понимать) такого рода записи.

Имею ввиду записи:

//--- оператор сложения
СMatrix           operator+(const CMatrix &m);
//--- оператор умножения
CMatrix           operator*(const CMatrix &m);


Здесь мы возвращаем объект?

 
Anton Mikheyko:

Здесь мы возвращаем объект?

Да. Потому что в результате выполнения оператора создается новый объект. Если передавать его указатель, будут проблемы с удалением указателя.

А в операторе = возвращается указатель на существующий объект просто для того, чтобы можно было записать a = b = c = d = e;

 
Anton Mikheyko:

Да. Вот этот момент (о чём спросил A100) я и имел ввиду.

Тут я не могу "переварить".

Поясните, пожалуйста, как следует читать (понимать) такого рода записи.

Имею ввиду записи:

//--- оператор сложения
СMatrix           operator+(const CMatrix &m);
//--- оператор умножения
CMatrix           operator*(const CMatrix &m);


Здесь мы возвращаем объект?

Это значит, что с переменными типа СMatrix можно производить арифметические действия + и *. Писать выражения типа var1=var2+var3. Где var1, var2, var3 объекты типа СMatrix.

В первом посте вы не весь код показали, где весь? Должен быть еще код выполнения этих действия. 

Возвращают они объекты, потому-что работают совместно с оператором равенства "=".

 
Можно не возвращать объект. Использовать оператор "+=". Выражения типа var1+=var2. Таким образом избавиться от необходимости создавать дополнительный объект и от оператора "=".
 
Комбинатор:

Да. Потому что в результате выполнения оператора создается новый объект. Если передавать его указатель, будут проблемы с удалением указателя.

А в операторе = возвращается указатель на существующий объект просто для того, чтобы можно было записать a = b = c = d = e;

В документации https://docs.mql4.com/ru/basis/function написано, что

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

Вот и возник вопрос. Противоречие в документации?

Раз мы возвращаем из функции объект, а не указатель на него.

Вот ещё пример непонятного)

CRow  CMatrix::GetColumnAsRow(const int col_index) const
  {
//--- переменная для получения значений из столбца
   CRow row();
//--- количество строк в матрице
   int rows=Rows();
//--- если количество строк больше нуля, выполняем операцию
   if(rows>0)
     {
      //--- массив для получения значений столбца с индексом col_index
      double array[];
      ArrayResize(array,rows);
      //--- заполнение массива
      for(int i=0;i<rows;i++)
        {
         //--- проверка номера столбца для i-ой строки на выход за пределы массива
         if(col_index>=this[i].Size())
           {
            Print(__FUNCSIG__,": Ошибка! Номер столбца ",col_index,"> размера строки ",i);
            break// row останется неинициализированным объектом
           }
         array[i]=this[i][col_index];
        }
      //--- создадим строку CRow на основе значений массива 
      row=array;
     }
//--- результат
   return(row);  // Как? Почему это правильно? row создали в функции и потом его "вынули" из неё без передачи указателя
  }


См. мой комментарий на предпоследней строчке.

 
Anton Mikheyko:

Вот и возник вопрос. Противоречие в документации?

Получается да. Не в первый и думаю не в последний раз.

 
Anton Mikheyko:


   return(row);  // Как? Почему это правильно? row создали в функции и потом его "вынули" из неё без передачи указателя
  }


См. мой комментарий на предпоследней строчке.

Это работает. Потому-что описан оператор "=". 
 

В общем, с Вашей помощью разобрался.

Всем спасибо за помощь в понимании кода!