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




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


Зміст


Пошук на інших ресурсах:

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.


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