Значение, возвращаемое перегруженными арифм. операциями
Как оформить такую функцию?
внутри класса:
CMatrix result();
// помещаешь сумму матриц в матрицу result.
return result;
}
Тут создается временный объект result. Но по выходу из программы происходит копирование матрицы. Если матрица не допускает поверхностного копирования, надо сделать конструктор копирования и перегрузить оператор == и, деструктор который будет освобождать выделенную оператором new память (если надо).
Как оформить такую функцию?
А эту часть я вообще не понял. :-(
{
// Код суммирования матриц
return *this; // Возвращение "себя" как результата
}
При условии, что нет циклов и прочих действий, недопустимых в inline
Что мешает объявить деструктор inline?
А какое отношение имеет inline к возвращаемому значению?
При условии, что нет циклов и прочих действий, недопустимых в inline
Циклы тоже не имеют отношения к inline.
inline - рекомендация компилятору, он ей не обязан следовать и все зависит от реализации компилятора, поэтому возможны компиляторы, которые циклы как инлайнят так и нет.
Кстати, если метод определяется внутри определения класса (что собственно и делается в приведенных примерах кода), то inline писать не обязательно, метод будет считаться инлайновым автоматически.
А вот так писать нельзя:
[color=red]CMatrix result();[/color]
// помещаешь сумму матриц в матрицу result.
return result;
}
Пустые конечно нельзя, но параметры зависят от конструкторов. Для тебя лично буду ставить многоточия вместо параметров.
Спасибо :)
Только не троеточие, я его не люблю (проблема "void*"). :)
Обоснование простое. Найдите хоть одно отличие:
CMatrix result();
и
CMatrix func();
Только не троеточие, я его не люблю (проблема "void*"). :)
Обоснование простое. Найдите хоть одно отличие:
CMatrix result();
и
CMatrix func();
Согласен, выглядит неоднозначно. Я хотел задействовать конструктор копии, потом подумал а что если класс CMatrix виртуальный. Вариантов может быть несколько.
Дык полуфабрикат не предназначен для прямой компиляции. То что внутри функции сильно зависит от реализации класса. Я просто хочу показать что инициализировать создаваемый объект можно при помощи недефолтового конструктора, а там уже человек сам думает. Можно даже сделать конструктор который принимает указатели на две матрицы и сохраняет сумму в создаваемой матрице. Тогда все делается в конструкторе с двумя параметрами...
Перебор со сложностью: operator + должен делать только сложение двух матриц указанного типа.
Чтоже касается "производных" типов, то здесь можно сделать простым использованием операторов типа "+=". Кстати, если есть operator +, то operator += напрашивается сам собой
{
TMatrixA& operator += (const TMatrixA &Other)
{
// код прибавления другой матрицы к этой
return *this;
};
TMatrixA operator + (const TMatrixA &Other) const
{
TMatrixA Copya = *this;
return (Copya += Other); // И весь код :D
}
};
// Производный объект "Матрица"
class TMatrixB: public TMatrixA
{
TMatrixB& operator += (const TMatrixB &Other)
{
TMatrixA::operator += (Other); // Вызываем суммирование базового класса
// код прибавления другой матрицы к этой
return *this;
};
TMatrixB operator + (const TMatrixB &Other) const
{
TMatrixB Copya = *this;
return (Copya += Other); // И весь код :D
}
};
За счёт этого мы избегаем наследования "+", который многократно возвращает временные объекты, заменяя вызовами оператора "+=", который возвращает ссылку.
Явный выигрыш в производительности программы.
Явный выигрыш в производительности программы.
Ну у тебя временный объект тоже создается
TMatrixB Copya = *this;
используется (перегруженный?) оператор = который по-видимому производит копирование, запускается функция делающая сложение и при выходе из функции результат заносится в стек...