Язык программирования C++. Вводный курс

         

Значение возвращаемого адреса должно оставаться


Значение возвращаемого адреса должно оставаться действительным после выхода из функции. В приведенной реализации возвращаемый адрес не затирается:











// нет возможности гарантировать отсутствие утечки памяти

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

Matrix&

operator+( const Matrix& m1, const Matrix& m2 )

{

   Matrix *result = new Matrix;

   // выполнить сложение ...

   return *result;



}

Однако это неприемлемо: происходит большая утечка памяти, так как ни одна из частей программы не отвечает за применение оператора delete к объекту по окончании его использования.

Вместо оператора сложения лучше применять именованную функцию, которой в качестве третьего параметра передается ссылка, где следует сохранить результат:











// это обеспечивает нужную эффективность,

// но не является интуитивно понятным для пользователя

void

mat_add( Matrix &result,

         const Matrix& m1, const Matrix& m3 )

{

   // вычислить результат



}

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











// более не поддерживается



Matrix c = a + b;

и использовать их в выражениях:











// тоже не поддерживается



if ( a + b > c ) ...

Неэффективный возврат объекта класса – слабое место С++. В качестве одного из решений предлагалось расширить язык, введя имя возвращаемого функцией объекта:











Matrix&

operator+( const Matrix& m1, const Matrix& m2 )

name result

{

   Matrix result;

   // ...

   return result;



}

Тогда компилятор мог бы самостоятельно переписать функцию, добавив к ней третий параметр-ссылку:











// переписанная компилятором функция

// в случае принятия предлагавшегося расширения языка

void

operator+( Matrix &result, const Matrix& m1, const Matrix& m2 )

name result

{

   // вычислить результат



}

и преобразовать все вызовы этой функции, разместив результат непосредственно в области, на которую ссылается первый параметр. Например:


Содержание  Назад  Вперед







Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий