Покажчики на об'єкти. Покажчики можуть посилатися на динамічні об'єкти, пам'ять для яких виділяється за допомогою операції new:
Timer*ptoday;
ptoday=new Timer;
У купі виділяється область для об'єкта типу Timer. Адреса першого байта цієї області присвоюється ptoday. Крім того, С++ викликає конструктор за умовчанням, який ініціалізує об'єкт. Якщо необхідно виділити пам'ять і викликати інший конструктор, то можна вказати відповідні параметри:
ptoday=new Timer(9,14,1917,10,45).
Об'єкти-посилання. Об'єкти можуть оголошуватись як посилання. Наприклад, оголошено глобальний об'єкт
Timer today;
Можемо визначити посилання:
Timer & rtoday=today;
Rtoday – це посилання. Оскільки посилання здійснюється на вже існуючі об'єкти, то при вході в область дії посилання конструктор класу не викликається і, відповідно, не викликається деструктор при виході з області дії.
Об'єкти – результати функцій. Об'єкти, посилання й покажчики на них можуть виступати як аргументи функцій. Функція може повертати об'єкт безпосередньо:
Timer newtime(void)
{Timer t;
|
|
return t;}
Тоді функція може викликатися так:
Timer anothertime=newtime();
При цьому результат, який повертається функцією newtime(), копіюється в anothertime. Однак у нашому випадку це не логічно, адже аналогічні дії виконуються при оголошенні: Timer anothertime;
Часто використовують посилання на об'єкт чи покажчик на об'єкт як результат функції:
Timer*newtime(void)
{Timer*p=new Timer;
return p;}
Тоді можна використати newtime() для отримання нового обє'кта та присвоїти його адресу покажчику на Timer:
Timer*tp=newtime();
Функції-посилання можна використовувати для посилання на існуючі об'єкти:
Timer today; – глобальний об'єкт.
Timer &newtimer(void)
{return today;}
Можна оголосити посилання на today:
Timer & tr=newtimer();
Масиви об'єктів. Масив об'єктів синтаксично задається як звичайний масив:
Timer tentimes[10];
При цьому клас, екземпляри якого утворюють масив, повинен обов'язково мати конструктор за умовчанням. Розглянемо приклад роботи з масивами об'єктів:
Main(void)
{ Timer tentimes[10];
for(int i=0;i<10;i++) tentimes[i].display();
return 0;}
Очевидно, що тут буде надруковано 10 однакових значень.
Можна ініціалізувати масив так:
Main(void)
{Timer tarray[3]={Timer(),Timer(8),Timer(8,1)};
for(int i=0;i<3;i++)tarray[i].display();
return 0;}
Масиви об'єктів можуть розміщуватись у купі та адресуватись за допомогою покажчиків:
Main()
{Timer*tarrayp;
tarrayp=new Timer[6];
for(int i=0;i<6;i++)
tarrayp[i].display();
delete[ ]tarrayp;
return 0;}
У цьому прикладі шість разів викликається конструктор за умовчанням при виділенні пам'яті оператором new та шість разів – деструктор при звертанні до delete, яка вжита в специфічній формі – із квадратними дужками (C++ ігнорує будь-які значення всередині дужок).