Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOAP.doc
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
494.59 Кб
Скачать

Статические элементы класса

Статические поля – хранят данные общие для всех объектов класса. Они существуют для всех объектов класса в одном экземпляре (не дублируются).

  • Память пот статическое поле выделяется один раз при его инициализации с помощью операции доступа к области действия.

class A{

public:

static int count;

};

int A::count; // инициализируется нулем

// int A::count = 10; // инициализируется другим образом

  • Статические поля доступны как через поля класса, так и через имя объекта:

A *a, b;

cout<< A::count << a->count << b.count;

  • Статические поля, описанные как private, можно изменить лишь с помощью статических методов.

  • Память, занимая статическим полем, не учитывается при определении размера объекта с помощью sizeof .

Статические методы – обрабатывают статические поля класса. Они обращаются непосредственно к статическим полям и вызывают только статические методы класса, им не передается указатель this. Обращение к статическим методам осуществляется так же, и к статическим полям

class A{

static int count;

public:

static void inc_count() {count++;}

};

int A::count; // инициализируется нулем

void f()

{

A a;

// a.count ++ - нельзя, поле скрытое

a.inc_count(); //или A::inc_count();

}

Статические методы не могут быть константными и виртуальными.

Дружественные функции и классы

служат для непосредственного доступа извне к скрытым полям класса (расширяют интерфейс класса).

Дружественные функции оформляют действия, не представляющие свойств класса, нуждающиеся в доступе к его скрытым полям.

Дружественная функция

  • объявляется внутри класса, к элементам которого нужен доступ, с ключевым словом friend. Параметром передается объект или ссылка на объект;

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

  • может быть дружественной нескольким классам.

class monstr; //Предварительное объявление класса

class hero{

public:

void kill( monstr &);

};

class monstr{

friend int steal_ammo(monstr &);

friend void hero::kill(monstr &);

};

int steal_ammo(monstr &M)

{return –M.ammo; }

void hero::kill(monstr &M)

{M.health = 0; M.ammo = 0;}

!!!Дружественные функции нарушают принцип инкапсуляции!!!

Если все методы класса должны иметь доступ к скрытым полям другого, весь класс объявляется дружественным:

class hero{

friend class mis;

};

class mis{

void f1();

void f2();

};

Функции f1 и f2 дружественные по отношению к hero имеют доступ ко всем его полям.

Деструкторы

- особый вид метода для освобождения памяти, занимаемой объектом. Вызывается автоматически при выходе объекта из области видимости:

  • для локальных – при выходе из блока;

  • для глобальных – при выходе из main;

  • для заданных через указатели при использовании delete.

Деструктор начинается с тильды, за которой следует имя класса:

  • не имеет аргументов и возвращаемого значения;

  • не может быть const / static;

  • не наследуется;

  • может быть виртуальным;

  • если не описан, создается автоматически как пустой.

Нужно создавать, если у объекта есть указатели на память, выделяемую динамически. Может вызываться явным образом при указании полностью уточненного имени (для объектов созданных с помощью перегруженной операции new).

monstr::~monstr()

{delete[] name;

}

void main()

{

monstr *m;

m -> ~monstr();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]