С++ для начинающих




Возврат значения - часть 3


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

  • возврат ссылки на локальный объект, время жизни которого ограничено временем выполнения функции. (О времени жизни локальных объектов речь пойдет в разделе 8.3.) По завершении функции такой ссылке соответствует область памяти, содержащая неопределенное значение. Например:
  • // ошибка: возврат ссылки на локальный объект

    Matrix& add( Matrix &m1, Matrix &m2 )

    {

        Matrix result:

        if ( m1.isZero()      )

            return m2;

        if ( m2.isZero()      )

            return m1;

        // сложим содержимое двух матриц

        // ошибка: ссылка на сомнительную область памяти

        // после возврата

        return result;

    }

    В таком случае тип возврата не должен быть ссылкой. Тогда локальная переменная может быть скопирована до окончания времени своей жизни:

    Matrix add( ... )

    • функция возвращает l-значение. Любая его модификация затрагивает сам объект. Например:
    • #include <vector>

      int &get_val( vector<int> &vi, int ix ) {

          return vi [ix];

      }

      int ai[4] = { 0, 1, 2, 3 };

      vector<int> vec( ai, ai+4 ); // копируем 4 элемента ai в vec

      int main() {

          // увеличивает vec[0] на 1

          get_val( vec.0 )++;

          // ...

      }

      Для предотвращения нечаянной модификации возвращенного объекта нужно объявить тип возврата как const:

      const int &get_val( ... )

      Примером ситуации, когда l-значение возвращается намеренно, чтобы позволить модифицировать реальный объект, может служить перегруженный оператор взятия индекса для класса IntArray из раздела 2.3.




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