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


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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



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

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

Свойства дружественных функций:

· объявляются внутри класса, к элементам которого им необходим доступ. При этом используется служебное слово friend. В качестве параметра дружественной функции передается объект или ссылка на объект в классе, т.к. this ей не передается (поскольку она не является членом класса).

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

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

Пример 1

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

Class hero

{

public:

void kill(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;

}

 

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


 

Дружественный класс

Если все методы какого-либо класса должны иметь доступ к скрытым полям другого класса, то он объявляется дружественным классом с помощью ключевого слова friend.

Пример 1

Class hero

{

friend class mistress;

};

Class mistress

{

void f1(...);

void f2(...);

};

 

Класс сам определяет, какие функции являются дружественными, а какие нет. Функции f1 и f2 – дружественные по отношению к классу hero и имеют прямой доступ ко всем полям класса.

Пример 2

#include <stream.h>

struct employee {

friend class manager;

employee* next;

char* name;

short department;

virtual void print();

};

struct manager: employee {

employee* group;

short level;

void print();

};

Void employee::print()

{

 cout << name << "\t" << department << "\n";

}

Void manager::print()

{

employee::print();

cout << "\tlevel " << level << "\n";

}

void f(employee* ll)

{

 for (; ll; ll=ll->next) ll->print();

}

Main ()

{

employee e;

e.name = "J. Brown";

e.department = 1234;

e.next = 0;

manager m;

m.name = "J. Smith";

m.department = 1234;

m.level = 2;

m.next = &e;

f(&m);

}


 

Глава 5. Локальные и вложенные классы

Локальный класс

Если класс объявляется внутри некоторой функции, то он называется локальным. Функция, в которой объявлен локальный класс, не имеет непосредственного доступа к компонентам локального класса. Доступ осуществляется с помощью указателя имени объектов встроенного класса.

 

Локальный класс не может иметь статических полей. Объекты локального класса могут быть созданы только внутри функции в области действия объявления класса, причем все компонентные функции локального класса должны быть встраиваемыми:

Пример 1

int x;

Void f()

{

 static int s;

 int x;

 extern int g();

 struct local {

   int g() { return x; } // ошибка, auto x

   int h() { return s; } // OK

   int k() { return::x; } // OK

   int l() { return g(); } // OK

 };

//...

}

local* p = 0; // ошибка: нет local в текущем контексте


Вложенный класс.

Класс, объявленный внутри другого класса, называют вложенным. Вложенный класс находится в области действия того класса, внутри которого он объявлен. Соответственно, объекты вложенного класса могут использовать компоненты внешнего класса, а компонентные функции и статические компоненты вложенного класса могут быть описаны вне глобального класса.

Пример 1

class Figura {

Class Point          // вложенный класс Point

{

int x, y, color;

public:

int getx() { return x; }

int gety() { return y; }

int getcolor() { return color; }

.......

};

Class Line           // вложенный класс Line

{



Поделиться:


Последнее изменение этой страницы: 2021-07-18; просмотров: 65; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.217.182.45 (0.009 с.)