ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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 «Виртуальные функции».)
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
