Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Бичков - Основи сучасного програмування.doc
Скачиваний:
69
Добавлен:
07.03.2016
Размер:
2.67 Mб
Скачать

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

При вивченні класів пам'яті ми вже зустрічалися з класом 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()

{...}

static void drawAll()

{point*p=first;

if(p==NULL)return;

do p->draw()while(p=p->next!=NULL);}};

У прикладі всі екземпляри класу, що породжуються, зберігаються в списку, який потім використовується для зображення всіх створених на даний момент фігур:

if (point::first!=NULL)

point::drawAll()

Існують чіткі правила iнiцiалiзацiї полів усередині опису класу. Звичайне поле не може бути iнiцiалiзоване при описі класу. Iніціалізація статичних полів допускається. Статичні змiнні можуть бути ініціалізовані за межами класу.

Якщо екземпляр класу оголошений як статичний, то цей клас не може мати конструкторів i, відповідно, жодне з його полів не може містити тип іншого класу, що має конструктор. Наприклад:

class A

{private: