68943

Статичні члени класу

Лекция

Информатика, кибернетика и программирование

Якщо перед оголошенням змінної-члена поставити ключове слово static, компілятор створить тільки один екземпляр цієї змінної, який використовуватиметься всіма об’єктами даного класу. На відміну від звичайних змінних-членів, статичні змінні-члени не копіюються для кожного об’єкту окремо.

Украинкский

2014-09-27

43.5 KB

2 чел.

Лекція № 5

Тема: Статичні члени класу

Члени класу (як функції, так і змінні) можуть бути статичними.

Якщо перед оголошенням змінної-члена поставити ключове слово static, компілятор створить тільки один екземпляр цієї змінної, який використовуватиметься всіма об'єктами даного класу. На відміну від звичайних змінних-членів, статичні змінні-члени не копіюються для кожного об'єкту окремо. Незалежно від кількості об'єктів класу, статична змінна завжди існує в одному екземплярі. Таким чином, всі об'єкти даного класу використовують одну і ту ж змінну. Всі статичні змінні ініціалізувалися нулем ще до створення першого об'єкту класу.

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

Щоб розібратися в механізмі використання статичних змінних-членів, розглянемо наступну програму.

#include <iostream>

using namespace std;

class shared {

static int а;

int b;

public:

void set(int i, int j) {a=i; b=j;}

void show();

} ;

int shared::a; // Визначуваний змінну а.

void shared::show() {

cout << "Це статична змінна а: " << а;

cout << "Чпето звичайна змінна b: " « b;

cout « "\n";

}

int main() {

shared x, у;

x.set(l, 1); // Привласнюваний змінною а значення 1 x.show();

у.set(2, 2); // Привласнюваний змінною b значення 2 у.show();

x.show();

/* Тут одночасно змінюються значення змінних-членів об'єктів х і у, оскільки змінна а використовується обома об'єктами. */

return 0;

}

Результат роботи цієї програми такий.

Це статична змінна а: 1

Це звичайна змінна b: 1

Це статична змінна а: 2

Це звичайна змінна b: 2

Це статична змінна а: 1

Це звичайна змінна а: 1

Зверніть увагу на те, що цілочисельна змінна а оголошена як усередині класу shared, так і поза ним. Ми вже указували, що це необхідно, оскільки оголошення змінній а усередині класу shared не супроводжується виділенням пам'яті.

Статична змінна-член виникає до створення першого об'єкту класу. Наприклад, в наступній короткій програмі змінна а одночасно є і відкритою, і статичною. Отже, функція main() має до неї прямий доступ. Оскільки змінна а виникає раніше об'єктів класу share, їй можна привласнити значення на самому початку програми. Як показано в програмі, при створенні об'єкту х значення змінної а не змінюється. З цієї причини обидва оператори висновку відображають на екрані одне і те ж значення — 99.

#include <iostream>

using namespace std;

class shared {

public:

static int а;

} ;

int shared::a; // Визначення змінної а.

int main() {

// Ініціалізація перед створенням об'єкту.

shared::а = 99;

cout << "Початкове значення змінної а: " << shared::а; cout « "\n";

shared х;

cout << "Значення змінної х.а: " << х.а;

return 0;

}

Зверніть увагу на те, що при зверненні до змінної а необхідно указувати ім'я класу, якому вона належить, і застосовувати оператора дозволу області видимості. Як правило, щоб звернутися до статичної змінної-члена незалежно від об'єкту, необхідно завжди указувати ім'я класу, в якому вона оголошена.

Статичні змінні-члени дозволяють управляти доступом до ресурсів, які спільно використовуються всіма об'єктами класу. Наприклад, можна створити декілька об'єктів, що записують дані на жорсткий диск. Проте очевидно, що в кожен конкретний момент часу запис може проводити лише один об'єкт. У таких ситуаціях слід оголосити статичну змінну, службовку індикатором. По значенню цієї змінної можна визначити, вільний файл або зайнятий. Кожний з об'єктів повинен аналізувати це значення перед початком запису. Розглянемо приклад, що ілюструє цю ситуацію.

#include <iostream>

using namespace std;

class cl   {

static  int resource; public:

int get_resource();

void free_resource() {resource = 0;}

};

int cl::resource; // Визначуваний ресурс.

int cl::get_resource() {

if(resource) return 0; // Ресурс зайнятий,

else {

resource = 1;

return 1;  // Ресурс наданий об'єкту.

}

}

int main() {

cl obi, ob2;

if(obi.get_resource()) cout << "Об'єкт obi володіє ресурсом\n";

if(!ob2.get_resource()) cout « "Об'єкту оЬ2 доступ запрещен\n";

obi.free_resource();  // Звільняємо ресурс.

if(ob2.get_resource())

cout << "Об'єкт оЬ2 може використовувати ресурс\n";

return 0;

}

За допомогою статичної змінної можна також визначити кількість існуючих об'єктів конкретного класу. Розглянемо приклад.

#include <iostream>

using namespace std;

class Counter {

public:

static int count;

Counter() { count++; }

~Counter() { count--; }

};

int Counter::count;

void Ј () ;

int main(void){

Counter ol;

cout << "Існуючі об'єкти: ";

cout « Counter::count << "\n";

Counter o2;

cout << "Існуючі об'єкти: ";

cout << Counter:-.count << "\n";

f();

cout « "Існуючі об'єкти: ";

cout << Counter::count « "\n";

return 0;

}

void f() {

Counter  temp;

cout  «   "Існуючі  об'єкти:   ",-

cout  «  Counter::count  «   "\n";

//  Після  повернення з функції  f()   змінна  temp знищується

}

Ця програма виводить на екран наступні рядки.

Існуючі об'єкти: 1

Існуючі об'єкти: 2

Існуючі об'єкти: 3

Існуючі об'єкти: 2

Як видимий, статична змінна-член count збільшується при кожному створенні об'єкту і зменшується при кожному знищенні. Отже, з її допомогою можна відстежити кількість існуючих об'єктів класу Counter.

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


 

А также другие работы, которые могут Вас заинтересовать

18920. Сущность и типология политической культуры. Виды политического участия 53 KB
  Сущность и типология политической культуры. Виды политического участия. Содержание понятия политическая культура обычно включает весь исторический опыт память социальных общностей и отдельных индивидов в сфере политики их ориентации и навыки влияющие на поли...
18921. Государственная служба как открытая система. «Электронное правительство» 27.5 KB
  Государственная служба как открытая система. Электронное правительство Государственная служба жизнеспособна только в условиях тесного взаимодействия с другими управляемыми системами. Открытость системы управления обеспечивается высокой степенью адапти
18922. Облака тегов для параллельной фильтрации данных 429.5 KB
  В работе рассматривается метафора визуализации и взаимодействия – контекстное облако тегов, предназначенная для эффективной интерпретации результатов поиска в Интернете. Данная метафора построена на основание формальной модели, включающей два основных утверждения...
18923. Психологические механизмы и методы влияния на аудиторию 98.5 KB
  Психологические механизмы и методы влияния на аудиторию 1.Психоаналитические подходы используют бессознательное в целях манипуляции сознанием потребителя. Одним из главных мотивов рекламы стало отождествление товара услуги с подсознательными сексуальными мот
18924. Web –сайт, как технология связей с общественностью 40.5 KB
  Web сайт как технология связей с общественностью. Несколько лет назад Интернет был новинкой и вызывал повышенные эмоции. В те времена когда только немногие организации действовали в online добиться успеха здесь было намного легче поскольку сайты вызывали интерес новиз
18925. Использование виэуального и вербального ресурсов в подготовке ПР-сообщения 44.5 KB
  Использование виэуального и вербального ресурсов в подготовке ПРсообщения Важный инструмент ПР совершенствование коммуникационных потоков. Необходим тщательный анализ аудитории и ее реакций. С аудиторией следует говорить преимущественно на ее языке постепенно...
18926. ПР-тексты и журналистские материалы: сходства и различия 34 KB
  ПРтексты и журналистские материалы: сходства и различия Предметом отображения PRтекста могут быть событие процесс ситуация отражающие деятельность базисного субъекта PR а также персона. Основные цели PRтекста информирование и создание а иногад и поддержание о
18927. Взаимодействие ПР-специалиста и журналиста в производстве новостей. Инфотейнмент 135.5 KB
  Взаимодействие ПРспециалиста и журналиста в производстве новостей. Инфотейнмент Переход России к рыночной экономике коммерциализация СМИ способствовали тому что информация развлекательного характера активно завоевывать место на страницах газет и журналов в тел...
18928. Жанры СМИ в арсенале ПР-специалиста 72.5 KB
  Жанры СМИ в арсенале ПРспециалиста Работа специалистов ПР с радио и ТВ предполагает знание аудиторий различных программ выбор жанра времени и продолжительности трансляции. Использование видеокамер диктофонов компьютеров и др. средств записи позволяет готовить м