Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция_05_INLINE_STATIC_CONST.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
123 Кб
Скачать
☆

Файл 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).

Из сказанного выше вытекает несколько важных следствий:

  1. статическая функция-член может вызываться независимо от того, существует или нет какой-либо представитель класса;

  2. статическая функция-член может манипулировать только статическими данными-членами класса и вызывать только другие статические функции-члены класса;

  3. статическая функция-член не может быть объявлена с модификатором 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;}

};