Класи і масиви. Покажчик на статичний член даних класу. Масиви статичних членів даних. Масиви покажчиків на статичні члени даних, що оголошені у класах. Приклади

Класи і масиви. Покажчик на статичний член даних класу. Масиви статичних членів даних. Масиви покажчиків на статичні члени даних, що оголошені у класах. Приклади


Зміст


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.


Зв’язані теми