Главная->Інформатика та програмування->Содержание->Временные безымянные объекты

ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 8) онлайн

Временные безымянные объекты

В примере COUNTPP2 мы создали временный объект temp типа Counter, чьей един- ственной целью было хранение возвращаемого значения для операции ++. Реа- лизация этого объекта потребовала трех строк программы:

Counter temp; // временный Объект Counter

temp.count = count; // присваиваем ему значение count return temp;     // возвращаем Объект

Существует много путей возвращения временного объекта из функции или перегруженной операции. Давайте рассмотрим еще один из способов в програм- ме COUNTPP3:

// countpp3.cpp

// операция ++ с использованием недекларированной переменной

#include <iostream>

using namespace std;

///////////////////////////////////////////////////////////

class Counter

{

  private:

    unsigned int count;

  public:

    Counter ( ) : count ( 0 )

      { }

    Counter ( int c ) : count ( c )

      { }

    unsigned int get_count ( )

      { return count; }

    Counter operator++ ( )

      {

        ++count;

        return Counter ( count );

      }

};

///////////////////////////////////////////////////////////

int main ( )

{

  Counter c1, c2;                        // определяем переменные

 

  cout << "\nc1 = " << c1.get_count ( ); // выводим на экран

  cout << "\nc2 = " << c2.get_count ( );

 

  ++c1;                                  // увеличиваем c1

  c2 = ++c1;                             // c1=2, c2=2

 

  cout << "\nc1 = " << c1.get_count ( ); // снова показываем значения

  cout << "\nc2 = " << c2.get_count ( ) << endl;

 

  return 0;

}

 

В строке этой программы return Counter ( count );

происходят все те же действия, которые в программе COUNTPP2 занимали три строки. Здесь создается объект типа Counter. Он не имеет имени, так как оно ни- где не будет использоваться. Этот объект инициализируется значением, полу- ченным в виде параметра count.

Но постойте: требуется ли здесь конструктор с одним аргументом? Да, тре- буется. Поэтому мы вставили этот конструктор в список методов класса в про- грамме COUNTPP3.

Counter ( int c ) : count ( с ) { }

Объект, инициализированный значением count, может быть возвращен функ- цией. Результат работы этой программы тот же, что и программы COUNTPP2.

В обеих программах использовано создание копии исходного объекта (объ- екта, для которого вызывается функция), эта копия затем и возвращается функ- цией. (В другом подходе применяется возврат исходного объекта с использова- нием указателя this; мы увидим это в главе 11 «Виртуальные функции».)

 

7