Классы и массивы. Указатель на статический член данных класса. Массивы статических членов данных. Массивы указателей на статические члены данных, которые объявлены в классах. Примеры
Содержание
- 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