Классы и массивы. Указатель на статический член данных класса. Массивы статических членов данных. Массивы указателей на статические члены данных, которые объявлены в классах. Примеры

Классы и массивы. Указатель на статический член данных класса. Массивы статических членов данных. Массивы указателей на статические члены данных, которые объявлены в классах. Примеры


Содержание


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.


Связанные темы