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

Билет 22

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

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

Но возникает такой вопрос: А как же наша хваленая защищенность данных, если можно получить доступ к данным напрямую ?

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

А теперь приведу несколько примеров использования дружественных функций(и не только) в языке С++.

// Описание класса A

class A

{

//...

void z(); // Описание функции z класса A

};

// Описание класса B

class B

{

//...

friend void A::z(); // Описание функции z класса A как дружественной

// классу B, т.е. из функции z класса A можно

// получить доступ к внутренним переменным класса B

};

// Описание класса C

class C

{

//...

friend class A; // Описание класса A как дружественного классу C,

// все функции класса A будут дружественны классу C и

// из любой функции класса A можно получить доступ к

// внутренним переменным класса C

}

class Employee //********** Класс "служащий" ******************************

{

public:

Employee( char *NName, char *NFam, char *NDep, int NAge);

virtual void print();

void SetName( char *NName);

int GetAge();

char *GetDep( char *NDep);

char *GetFam( char *NFam);

char *GetName( char *NName);

void SetAge( int NAge);

void SetDep( char *NDep);

void SetFam( char *NFam);

Employee();

virtual ~Employee();

friend istream& operator >>(istream&,Employee&);

friend ostream& operator <<(ostream&,Employee&);

protected:

int Age;

char *Dep;

char *Name;

char *Fam;

};

• Дружественная функция объявляется внутри класса, к элементам которого ей нужен доступ, с ключевым словом friend. В качестве параметра ей должен передаваться объект или ссылка на объект класса, поскольку указатель this ей не передается. • Дружественная функция может быть обычной функцией или методом другого ранее определенного класса. На нее не распространяется действие спецификаторов доступа, место размещения ее объявления в классе безразлично. • Одна функция может быть дружественной сразу нескольким классами.

Задание: НТМL. Вставить несколько рисунков в разные документы. В отдельном документе сделать для них гиперссылки

1.htm

<HTML>

<HEAD>

<TITLE>1</TITLE>

</HEAD>

<BODY><img src="лес.jpg"></BODY>

</HTML>

2.htm

<HTML>

<HEAD>

<TITLE>2</TITLE>

</HEAD>

<BODY><img src="поле.jpg"></BODY>

</HTML>

3.htm

<HTML>

<HEAD>

<TITLE>3</TITLE>

</HEAD>

<BODY>

<a href="1.htm">Лес</a><BR>

<a href="2.htm">Поле</a><BR>

</BODY>

</HTML>

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