Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c_1_po_16.docx
Скачиваний:
5
Добавлен:
06.12.2018
Размер:
71.4 Кб
Скачать

14)Дружественные функции (методы).

Иногда желательно иметь непосредственный доступ извне к скрытым полям

класса, то есть расширить интерфейс класса. Для этого служат дружественные

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

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

представляют собой альтернативу методам. Метод, как правило, используется

для реализации свойств объекта, а в виде дружественных функций оформляются

действия, не представляющие свойства класса, но концептуально входящие в его

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

операции вывода объектов

Ниже перечислены правила описания и особенности дружественных функций.

• Дружественная функция объявляется внутри класса, к элементам которого

ей нужен доступ, с ключевым словом friend. В качестве параметра ей должен

передаваться объект или ссылка на объект класса, поскольку указатель this

ей не передается.

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

ранее определенного класса. На нее не распространяется действие спецификаторов

доступа, место размещения ее объявления в классе безразлично.

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

В качестве примера ниже приведено описание двух функций, дружественных

классу monstг. Функция kill является методом класса hero, а функция steal ammo

не принадлежит ни одному классу. Обеим функциям в качестве параметра передается

ссылка на объект класса monstr.

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

class hero{

public:

void kil(monstr &);

class monstr{

friend int steal_ammo(monstr &);

friend void hero::kill(monstr &);

//' Класс hero должен быть определен ранее

}:

int steal_ammo(monstr &M){return --M.ammo;}

void hero::kill(monstr &M){M.health = 0: M.ammo = 0;}

Использования дружественных функций нужно по возможности избегать, поскольку

они нарушают принцип инкапсуляции и, таким образом, затрудняют отладку

и модификацию программы.

15)Статические поля и методы.

С помощью модификатора static можно описать статические поля и методы

класса. Их можно рассматривать как глобальные переменные или функции, доступные

только в пределах области класса.

Статические поля

Статические поля применяются для хранения данных, общих для всех объектов

класса, например, количества объектов или ссылки на разделяемый всеми объектами

ресурс. Эти поля существуют для всех объектов класса в единственном экземпляре,

то есть не дублируются.

Ниже перечислены особенности статических полей.

• Память под статическое поле выделяется один раз при его инициализации

независимо от числа созданных объектов (и даже при их отсутствии) и инициализируется

с помощью операции доступа к области действия, а не операции

выбора (определение должно быть записано вне функций):

class А{

public:

static int count; // Объявление в классе

};

int A::count: // Определение в глобальной области

// По умолчанию инициализируется нулем

// int A::count = 10: Пример инициализации произвольным значением

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

А *а, Ь:

cout « A::count « a->count « b.count:

// Будет выведено одно и то же

• На статические поля распространяется действие спецификаторов доступа,

поэтому статические поля, описанные как private, нельзя изменить с помощью

операции доступа к области действия, как описано выше. Это можно

сделать только с помощью статических методов (см. далее).

• Память, занимаемая статическим полем, не учитывается при определении

размера объекта с помощью операции sizeof.

Статические методы

Статические методы предназначены для обращения к статическим полям класса.

Они могут обращаться непосредственно только к статическим полям и вызывать

только другие статические методы класса, потому что им не передается скрытый

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

статическим полям — либо через имя класса, либо, если хотя бы один объект

класса уже создан, через имя объекта.

class А{

static int count; // Поле count - скрытое

public:

static void inc_count(){ count++; }

};

A::int count: // Определение в глобальной области

void f(){

А а;

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

// Изменение поля с помощью статического метода:

a.inc_count(); // или А::inc__count();

}

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

(virtual).

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