- •Встраиваемые (inline) функции
- •Файл Dot.H
- •Статические данные-члены класса
- •Файл Dot.H
- •Файл Dot.Cpp
- •Файл Main.Cpp
- •В памяти существует 3 объекта типа Dot
- •Статические функции-члены класса
- •Константные объекты
- •Использование указателей на функции-члены класса
- •Константные функции-члены класса
- •Массивы объектов класса
Файл Dot.H
class Dot
{
static int count;// объявление статического данного-члена – счётчика объектов
char name;
int x, y;
public:
Dot (char Name) {name=Name; x=0; y=0; count++;}
~Dot() {count--;}
void PrintCount(); // функция выводит количество существующих объектов
};
Файл Dot.Cpp
#include "Dot.h"
void Dot::PrintCount()
{
char S[30];
CharToOem("В памяти существует ", S);
cout<<S<<count;
CharToOem(" объекта типа Dot\n", S);
cout<<S;
}
Файл Main.Cpp
#include "Dot.h"
int Dot::count=0; // инициализация статического данного-члена
int main()
{
Dot A('A'), B('B'), C('C');
A.PrintCount();
cout<<Dot::count<<'\n'; // ошибка: данное-член count недоступен
}
В этом примере статическое данное-член count содержит количество существующих объектов. Инициализация данного-члена count осуществляется перед выполнением программы и созданием объектов в файле основной программы с помощью оператора: void Dot::PrintCount()
Обратите внимание, что обращение к этому члену класса в функции main() в операторе cout<<Dot::count<<'\n'; приводит к ошибке, поскольку данное-член класса count объявлено как закрытое и является недоступным за пределами класса.
При выполнении программа выводит на экран:
В памяти существует 3 объекта типа Dot
Корректный учёт количества существующих объектов достигается двумя действиями: каждый конструктор, (в том числе и конструктор копирования) увеличивает счётчик на единицу, деструктор – уменьшает на единицу. Поскольку конструктор вызывается при создании каждого объекта, а деструктор – при уничтожении, то данное-член count будет содержать количество существующих объектов независимо от того каким образом и в какой области определения создан или уничтожен объект.
Статические функции-члены класса
Особенностью использования статических функций-членов является то, что они также определены в единственном экземпляре и не являются безраздельной собственностью какого-то представителя класса. В связи с этим им не передается указатель this. Эта особенность статических функций-членов используется при написании функций-обработчиков прерываний и callback-функций (при программировании для Windows).
Из сказанного выше вытекает несколько важных следствий:
статическая функция-член может вызываться независимо от того, существует или нет какой-либо представитель класса;
статическая функция-член может манипулировать только статическими данными-членами класса и вызывать только другие статические функции-члены класса;
статическая функция-член не может быть объявлена с модификатором virtual.
Пример 7.
Файл Dot.h
class Dot
{
int x,y;
static int count;
public:
Dot () {x=0; y=0; count++;}
~Dot() {count--;}
static int GetCount() {return count;}
void PrintCount();
};
Файл Dot.cpp
#include "Dot.h"
void Dot::PrintCount()
{
char T[30];
CharToOem("В памяти существует ", T);
cout<<T<<count;
CharToOem(" объекта типа Dot\n", T);
cout<<T;
}
Файл Main.cpp
#include "Dot.h"
int Dot::count=0; // инициализация статического данного-члена
int main()
{
char S[25];
CharToOem("Сейчас есть объектов: ", S);
cout<<S<<Dot:: GetCount()<<'\n';
Dot A, B, C;
A.PrintCount();
cout<<Dot:: GetCount()<<'\n';
}
Константные данные-члены класса
Данное-член класса может быть объявлен с модификатором const, который указывают перед типом константного данного. Ключевое слово const информирует компилятор, что значение данного элемента объекта не должно изменяться после инициализации. Константные данные-члены класса нельзя инициализировать в теле конструктора обычным образом. Список инициализации является единственным методом инициализации данных-констант. Приведем пример объявления константного данного и его инициализации:
Пример 8.
class Dot // класс точки
{
const char name; // имя точки – константное данное-член
double x, y; // координаты точки
public: // открытые члены класса
Dot(char Name, double X, double Y): name(Name), x(X), y(Y) {}
// или так Dot(char Name, double X, double Y): name(Name) { x=X; y=Y;}
Dot(char Name): name(Name) {x=0; y=0;}
};
