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.

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


 

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

41868. Табличный процессор Excel. Ознакомление. Форматирование таблиц в Excel 202.96 KB
  Название ошибки Значение ошибки ДЕЛ 0 Деление на нуль Н Д Неопределенные данные ИМЯ Программа не может распознать имя использованное в формуле ПУСТО Задано пересечение областей не имеющих общих ячеек ЧИСЛО Возникли проблемы с числом ССЫЛКА Формула неправильно ссылается на ячейку например если ячейки были удалены ЗНАЧ Аргумент или операнд имеет недопустимый тип ВЫПОЛНЕНИЕ РАБОТЫ: Задание Создать таблицу в соответствии с предложенным вариантом по образцу. Создайте таблицу в соответствии с вашим вариантом по образцу Для...
41869. ПОВЕРКА ТЕРМОЭЛЕКТРИЧЕСКИХ ПРЕОБРАЗОВАТЕЛЕЙ 505.94 KB
  Описание установки Поверка ТП производится при помощи эталонного калибратора температуры КТ–500 рис. Термоэлектродвижущая сила ТЭДС измеряется прибором универсальным измерительным типа Р4833 рис. Рис. Методика и порядок проведения поверки В условиях учебной лаборатории поверка ТП включает внешний осмотр определение соответствия статической характеристики преобразователя стандартной НСХ.
41870. Эффекты в CorelDRAW. Эффект "Перетекание" 1006.33 KB
  Рассмотрим работу инструмента на примере перетекания двух объектов: Рис. 1 На рис. На правой части этого же рисунка показан результат применения инструмента Интерактивное перетекание при следующих параметрах его работы: Число шагов в перетекании = 4; Вид перетекания = прямое; Ускорение = 0 рис.2 Рис.
41871. ПОВЕРКА ТЕХНИЧЕСКОГО АМПЕРМЕТРА И ВОЛЬТМЕТРА МАГНИТОЭЛЕКТРИЧЕСКОЙ СИСТЕМЫ 61.41 KB
  В практике поверки измерительных приборов нашли применение два способа: сопоставление показаний поверяемого и образцового приборов; сравнение показаний поверяемого прибора с мерой данной величины. Верхний предел измерений образцового прибора должен быть таким же как и поверяемого или не превышать предел измеряемого прибора более чем на 25. Допустимая погрешность образцового прибора должна быть 3.5 раз ниже погрешности поверяемого прибора.
41872. Зерновая характеристика угольной пыли и её представление 57.67 KB
  Зерновая характеристика угольной пыли и её представление. Тонкость помола или дисперсность угольной пыли определяют рассевом её пробы на рассевочной машине оснащённой набором сит с размерами отверстий от 50 до 1000 мкм. Коэффициент полидисперсностиnхарактеризует структуру пыли с точки зрения равномерности помола топлива. Чем выше n тем менее отличаются своим размером частицы пыли друг от друга.
41873. MS Access 2007: Создание запросов 351.77 KB
  Для вывода на экран БЛАНКА ЗАПРОСА необходимо: вкладка Создание группа команд Другие – Конструктор запросов; в появившемся диалоговом окне Добавление таблицы выделите удерживая нажатой левую кнопку мыши все таблицы; щелкните по кнопкам Добавить и Закрыть; на экран будет выведено окно Конструктора запросов. В нижней панели – пустой бланк запроса. Назначение строк бланка запроса: Поле Указываются имена полей участвующих в запросе Имя таблицы Автоматически выводятся имена таблиц соответствующих выбранным полям Групповая операция...
41874. Ознакомиться с основными положениями теории погрешности, измерить высоту, диаметр и объем цилиндра. Правильно обработать результаты измерений 54.31 KB
  В результате проделанной работы ознакомились с основными положениями теории погрешности, рассчитали относительную погрешность измерений.
41876. Исследования трения в резьбовых соединениях 64.49 KB
  Экспериментально определить значения коэффициентов трения в резьбе и на торце гайки; проверить теоретическую зависимость между осевым усилием на болте Fα и моментом завинчивания Тзав. № показаний К2 ед Fα по 17 Н K2ед Тзав по 18 Нмм 1 2 3 4 5 График зависимости Тзав= f Fα Определение коэффициентов трения. Сила затяжки FаН Тзав Нмм f1 по 8 f по 4 025...