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

Билет 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>22 билет</TITLE>

</HEAD>

<BODY>

<a name=first><IMG src="1.jpg"></a>

<br>

<a name=second><IMG src="2.jpg"></a>

</BODY>

</HTML

2.htm

<HTML>

<HEAD>

<TITLE>22 билет</TITLE>

</HEAD>

<BODY>

<a name=third><IMG src="3.jpg"></a>

</BODY>

</HTML>

3.htm

<HTML>

<HEAD>

<TITLE>22 билет</TITLE>

</HEAD>

<BODY>

<A href ="22-1.html#first">Ссылка на документ №1 на первую картинку</A>

<br>

<A href ="22-1.html#second">Ссылка на документ №1 на вторую картинку</A>

<br>

<A href ="22-2.html">Ссылка на документ №2</A>

</BODY>

</HTML>

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