Это значит, что с переменными типа СMatrix можно производить арифметические действия + и *. Писать выражения типа var1=var2+var3. Где var1, var2, var3 объекты типа СMatrix.
В первом посте вы не весь код показали, где весь? Должен быть еще код выполнения этих действия.
Возвращают они объекты, потому-что работают совместно с оператором равенства "=".
Можно не возвращать объект. Использовать оператор "+=". Выражения типа var1+=var2. Таким образом избавиться от необходимости создавать дополнительный объект и от оператора "=".
Оператор return может возвращать значение выражения, стоящего в этом операторе. Значение выражения при необходимости преобразуется к типу результата функции. Можно возвращать простые типы, простые структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур.
Вот и возник вопрос. Противоречие в документации?
Раз мы возвращаем из функции объект, а не указатель на него.
Вот ещё пример непонятного)
CRow CMatrix::GetColumnAsRow(constint 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 создали в функции и потом его "вынули" из неё без передачи указателя }
А почему тогда оператор сложения (в отличии от присваивания) возвращает не указатель? Ведь "перекинул и все дела"!
Вас действительно интересует этот вопрос, или лишь бы поговорить?
Да. Вот этот момент (о чём спросил A100) я и имел ввиду.
Тут я не могу "переварить".
Поясните, пожалуйста, как следует читать (понимать) такого рода записи.
Имею ввиду записи:
СMatrix operator+(const CMatrix &m);
//--- оператор умножения
CMatrix operator*(const CMatrix &m);
Здесь мы возвращаем объект?
Здесь мы возвращаем объект?
Да. Потому что в результате выполнения оператора создается новый объект. Если передавать его указатель, будут проблемы с удалением указателя.
А в операторе = возвращается указатель на существующий объект просто для того, чтобы можно было записать a = b = c = d = e;
Да. Вот этот момент (о чём спросил A100) я и имел ввиду.
Тут я не могу "переварить".
Поясните, пожалуйста, как следует читать (понимать) такого рода записи.
Имею ввиду записи:
СMatrix operator+(const CMatrix &m);
//--- оператор умножения
CMatrix operator*(const CMatrix &m);
Здесь мы возвращаем объект?
Это значит, что с переменными типа СMatrix можно производить арифметические действия + и *. Писать выражения типа var1=var2+var3. Где var1, var2, var3 объекты типа СMatrix.
В первом посте вы не весь код показали, где весь? Должен быть еще код выполнения этих действия.
Возвращают они объекты, потому-что работают совместно с оператором равенства "=".
Да. Потому что в результате выполнения оператора создается новый объект. Если передавать его указатель, будут проблемы с удалением указателя.
А в операторе = возвращается указатель на существующий объект просто для того, чтобы можно было записать a = b = c = d = e;
В документации https://docs.mql4.com/ru/basis/function написано, что
Вот и возник вопрос. Противоречие в документации?
Раз мы возвращаем из функции объект, а не указатель на него.
Вот ещё пример непонятного)
{
//--- переменная для получения значений из столбца
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 создали в функции и потом его "вынули" из неё без передачи указателя
}
См. мой комментарий на предпоследней строчке.
Вот и возник вопрос. Противоречие в документации?
Получается да. Не в первый и думаю не в последний раз.
return(row); // Как? Почему это правильно? row создали в функции и потом его "вынули" из неё без передачи указателя
}
См. мой комментарий на предпоследней строчке.
В общем, с Вашей помощью разобрался.
Всем спасибо за помощь в понимании кода!