Статична пам'ять і класи

При вивченні класів пам'яті ми вже зустрічалися з класом static. Специфікатор класу пам'яті static впливає на час життя та область дії змінної чи функції. Змінна, оголошена зі специфікатором класу пам'яті static, існує в єдиному екземплярі в межах області видимості.

Клас пам'яті static може використовуватись і при оголошенні полів класу. Специфіка статичних полів полягає в тому, що вони мають одне й те саме значення в усiх об'єктах даного класу. Іншими словами, якщо описати статичне поле при заданні класу, то в усіх його екземплярів значення відповідного поля завжди буде однаковим. Зміна значення статичного поля в одному з об'єктів класу приведе до зміни цього значення в усіх його екземплярах (для всіх екземплярів класу виділяється одне й те саме місце в пам'яті для збереження статичного поля).

class statpol {

public:

static int i;}a,b,c;

Main()

{a.i=1;

cout<<b.i<<"\n";

cout<<c.i<<"\n";}

Для роботи зі статичним полем у С++ версії 3.11 необхідно оголошувати його за межами протоколу класу. При компіляції наведеного вище прикладу помилки не виникне, але вона виникне на етапі лінкування програми. Щоб її уникнути, необхідне зовнішнє оголошення:

int statpol::i;

Статичні поля можуть ініціалізуватися за допомогою глобальних оголошень типу

int statpol::i=1;

Доступ до статичного поля можна здійснювати й за допомогою операції розширення області видимості, яка застосовується до імені відповідного класу:

Main()

{

statpol a;

a.i=1;

statpol::i=2;

//...}

Допускаються статичні екземпляри класу. Доступ до полів даних і функцій-членів статичних екземплярів класу ззовні функцій-членів цього класу здійснюється за допомогою операції розширення області видимості ::, що застосовується до імені класу, або за допомогою "." чи "-->" (як і для звичайних полів). Наприклад:

static statpol a;

Main()

{cout<<a.i<<"\n";

cout<<statpol::i;}

Статичні поля зручно використовувати у випадку, коли необхідно виконувати операції над усіма екземплярами класу чи зберігати інформацію про них. Статичним полем може бути лічильник екземплярів деякого класу. Наприклад:

Class Point

{floаt x,y;

static Point*first=NULL;

static Point*last=NULL;

Point*next;

publiс:

Point(float ax,float ay)

{x=ax; y=ay;

if(first==NULL){first=this;last=this}

else{last.next=this;last=this;}}

Vоid draw()

{...}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: