Класи і масиви. Покажчик на статичний член даних класу. Масиви статичних членів даних. Масиви покажчиків на статичні члени даних, що оголошені у класах. Приклади
Зміст
- 1. Як оголосити покажчик на статичний член даних класу? Приклад
- 2. Приклад використання масиву, елементами якого є статичні члени даних класу
- 3. Приклад використання масиву, елементами якого є покажчики на статичні члени даних класу
- 4. Чому рівне значення статичного члена, якщо його не ініціалізувати?
- Зв’язані теми
Пошук на інших ресурсах:
1. Як оголосити покажчик на статичний член даних класу? Приклад
Щоб оголосити покажчик на статичний член даних класу потрібно просто описати покажчик на тип даних, який має статичний член даних. Потім, у деякому програмному коді, цьому покажчику потрібно присвоїти адресу статичного члена даних об’єкту цього класу.
Послідовність кроків наступна:
- оголосити клас зі статичним членом деякого типу;
- описати статичний член даних класу за межами класу та ініціалізувати його при необхідності;
- у деякому методі або за межами усіх методів (глобальний покажчик) описати покажчик на тип, що має статичний член даних класу;
- описати об’єкт класу зі статичним членом класу;
- присвоїти покажчику адресу статичного члена даних об’єкту класу.
Приклад. У прикладі оголошується клас CPi зі статичним членом даних Pi. Також оголошується декілька статичних членів, які не є членами класу.
У функції _tmain() демонструється використання покажчиків на оголошеністатичні члени даних.
#include "stdafx.h" #include <iostream> using namespace std; // оголошення класу, що містить статичний член даних class CPi { public: static double Pi; // статичний член даних - константа }; // оголошення статичної змінної за межами класу з одночасною ініціалізацією static double Exp = 2.7182818284; // експонента // ініціалізація статичного члена класу CPi double CPi::Pi = 3.141592653589793; // неініціалізовані статичні змінні, значення яких = 0 (за замовчуванням) static double ZeroD; static int ZeroI; static char ZeroC; int * pZ; // зовнішній покажчик на int int _tmain(int argc, _TCHAR* argv[]) { double d; CPi obj; // об'єкт класу double * pPi; // покажчик на double double * pExp; // покажчик на double // покажчик вказує на статичний член даних об'єкту obj класу CPi pPi = &obj.Pi; pExp = &::Exp; // вказує на статичний член даних Exp - інший вид доступу через :: // перевірка d = obj.Pi; // d = 3.14159 d = Exp; // d = 2.71828 d = ::Exp; // d = 2.71828 - так теж можна d = *pPi; // d = 3.14159 // зовнішній покажчик на int pZ = &ZeroI; d = *pZ; // d = 0 *pZ = 5; d = ZeroI; // d = 5 return 0; }
2. Приклад використання масиву, елементами якого є статичні члени даних класу
Задано 3 класи з іменами CCounter1, CCounter2, CCounter3. У кожному класі реалізовано по одному статичному члену даних відповідно з іменами counter1, counter2, counter3.
Оскільки, в класах є статичні члени даних, то їх відповідним чином можна ініціалізувати. Також у прикладі оголошується глобальний масив з іменем arCount1[], який ініціалізований статичними членами даних класів CCounter1, CCounter2, CCounter3.
Лістинг оголошення класів та ініціалізації статичних членів наступний:
// оголошується 3 класи зі статичними змінними // клас, що містить статичну змінну count class CCount1 { public: static int count1; // статичний член даних, ключове слово static }; class CCount2 { public: static int count2; // статичний член даних, ключове слово static }; class CCount3 { public: static int count3; // статичний член даних, ключове слово static }; // оголошення ініціалізація статичних членів даних класів // тут ключового слова static не потрібно int CCount1::count1; // за замовчуванням значення статичного члена = 0 int CCount2::count2 = 5; int CCount3::count3 = 100; // оголошення масиву, що ініціалізований статичними членами даних int arCount1[] = { CCount1::count1, CCount2::count2, CCount3::count3 };
Нижче продемонстровано використання глобального масиву arCount1[] та локального масиву arCount2[], оголошеного безпосередньо у функції _tmain() для консольних додатків:
int _tmain(int argc, _TCHAR* argv[]) { // використання масиву arCount1 int d; d = arCount1[0]; // d = 0 d = arCount1[1]; // d = 5 d = arCount1[2]; // d = 100 // змінити значення масиву arCount1[2] так, // щоб воно містило значення статичного члена класу CCount1 arCount1[2] = CCount1::count1; d = arCount1[2]; // d = 5 // Оголошення локального масиву arCount2 int arCount2[5]; // заповнення масиву arCount2 деякими значеннями статичних членів arCount2[0] = CCount1::count1; arCount2[1] = CCount2::count2; d = arCount2[1]; // d = 5 return 0; }
3. Приклад використання масиву, елементами якого є покажчики на статичні члени даних класу
У даному прикладі за зразком попереднього прикладу (п.2) оголошується 3 класи з іменами CCounter1, CCounter2, CCounter3. У цих класах оголошується по одному статичному члену даних відповідно з іменем counter1, counter2, counter3, які окремо ініціалізуються початковими значеннями.
Приклад демонструє оголошення та використання масивів покажчиків arPCount1 та arPCount2 на статичні члени даних, які є членами даних деякого класу.
Лістинг оголошення класів, статичних членів даних та масиву покажчиків має наступний вигляд:
// оголошується 3 класи зі статичними змінними // клас, що містить статичну змінну count class CCount1 { public: static int count1; // статичний член даних }; class CCount2 { public: static int count2; // статичний член даних }; class CCount3 { public: static int count3; // статичний член даних }; // оголошення ініціалізація статичних членів даних класів int CCount1::count1; // за замовчуванням значення статичного члена = 0 int CCount2::count2 = 5; int CCount3::count3 = 100; // оголошення глобального масиву покажчиків на статичні члени даних int * arPCount1[] = { &CCount1::count1, &CCount2::count2, &CCount3::count3 };
Демонстрація використання масиву покажчиків у функції _tmain()
int _tmain(int argc, _TCHAR* argv[]) { // використання масиву покажчиків arPCount1 d = *arPCount1[0]; // d = 0 d = *arPCount1[1]; // d = 5 // змінити значення масиву покажчиків arPCount1[2] так, // щоб він вказував на статичний член класу CCount2 arPCount1[2] = &CCount2::count2; d = *arPCount1[2]; // d = 100 // Оголошення локального масиву arPCount2 int * arPCount2[5]; // заповнення масиву arPCount2 деякими значеннями та їх використання arPCount2[0] = &CCount1::count1; arPCount2[1] = &CCount3::count3; d = *arPCount2[1]; // d = 100 return 0; }
4. Чому рівне значення статичного члена, якщо його не ініціалізувати?
Якщо статичний член не ініціалізований, то встановлюється значення за замовчуванням:
- для числових типів (int, float, double …) значення неініціалізованого статичного члена рівне 0
- для типу char значення неініціалізованого статичного члена рівне символу з кодом 0.
- для типу bool значення рівне false, що також відповідає значенню 0.
Зв’язані теми
- Визначення масиву. Одновимірні масиви. Ініціалізація масиву
- Масиви об’єктів в unmanaged та managed класах. Приклади. Масив unmanaged–покажчиків на об’єкт класу
- Масиви покажчиків на методи, що є членами класу. Приклади
- Використання членів даних класу. Статичні (static) члени даних в класі. Статичні члени даних для native-класів та managed-класів в середовищі CLR