Тот факт, что локальные переменные могут объявляться в любом месте блока кода, имеет важное значение для создания объектов. В реальных программах часто необходимо создавать объекты, инициализирующиеся значениями, появляющимися только в процессе выполнения программы. Имея возможность создавать объект после того, как эти величины становятся известными, можно избежать усложнения программы, которое возникает, когда сначала создается неинициализированный объект и лишь затем ему присваивается значение.
Для того, чтобы увидеть преимущества, предоставляемые объявлением локальных объектов вблизи точки их первого использования, рассмотрим следующую версию программы timer. В ней два объекта b и c создаются, используя информацию, получаемую во время выполнения программы как раз перед первым использованием этих объектов. Программа также иллюстрирует преимущества перегрузки конструкторов, что позволяет реализовать различные способы инициализации.
#include <iostream.h>
#include <stdlib.h>
#include <time.h>
class timer {
int seconds;
public:
// секунды задаются строкой
timer(char *t) { seconds = atoi(t); }
// секунды задаются целым числом
timer (int t) { seconds = t; }
// время задается в минутах и секундах
timer (int min, int sec) { seconds = min*60 + sec; }
void run();
};
void timer::run()
{
clock_t t1, t2;
t1 = t2 = clock ()/CLK_TCK;
while (seconds) {
if (t1/CLK_TCK+1 <= (t2=clock())/CLK_TCK) {
seconds--;
t1 = t2;
}
}
cout << "\a"; // звонок
}
int main()
{
timer a (10);
a.run();
cout << "Enter number of seconds: ";
char str [ 80];
cin >> str;
timer b(str); // инициализация во время выполнения с помощью строки
b.run();
cout << "Enter minutes and seconds: ";
int min, sec;
cin >> min >> sec;
timer с(min, sec); /* инициализация во время выполнения с помощью минут и секунд */
c.run();
return 0;
}
Как можно видеть, объект а создан с использованием целой константы. В то же время объекты b и с созданы с использованием информации, введенной пользователем. Поэтому они не объявлялись до тех пор, пока эта информация не была известна. Таким образом, объекты b и с созданы с использованием данных, которые были сформированы как раз перед точкой их создания. Для объекта b в качестве таких данных выступает строка, в которой записаны секунды. Для объекта с данными служат два целых числа, с помощью которых вводятся минуты и секунды. Поскольку допустимы различные форматы инициализации, то нет необходимости выполнять преобразования данных от одного типа к другому при инициализации объекта. Из сказанного можно заключить, что целесообразно создавать объекты перед точкой их первого использования.