Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Самоучитель С++ - Шилдт Г.

Шилдт Г. Самоучитель С++ — Спб.: БВХ-Петербург, 2003. — 688 c.
ISBN 5-7791-0086-1
Скачать (прямая ссылка): samouchitelc2003.djvu
Предыдущая << 1 .. 25 26 27 28 29 30 < 31 > 32 33 34 35 36 37 .. 206 >> Следующая

Дружественная функция задается так же, как обычная, не являющаяся членом класса, функция. Однако в объявление класса, для которого функция будет дружественной, необходимо включить ее прототип, перед которым ставится ключевое слово friend. Чтобы понять, как работает дружественная функция, рассмотрим следующую короткую программу:
gg _ __ Самоучитель C++
// Пример использования дружественной функции ^include <iostream> using namespace std;
class myclass ( int n, d; public:
myclass {inti, int j) { n = i; d = j; }
// объявление дружественной функции для класса myclass friend int isfactor (myclass ob) ;
};
/* Здесь представлено определение дружественной функции. Она возвращает истину, если п делится без остатка на d. Отметьте, что ключевое слово friend в определении функции isf actor () не используется.
*/
int isfactor (myclass ob)
{
if(!(ob.n% ob*d>) return 1; else return 0;
}
int main()
{
myclass obi (10P 2), ob2(13, 3);
if (isfactor(obi) cout << "10 без остатка делится на 2\nM; else cout << "10 без остатка не делится на 2\п";
if {isfactor(ob2) cout << "13 без остатка делится на 3\пм; else cout << "13 без остатка не делится на 3\п,г;
return 0;
}
В этом примере в объявлении класса myclass объявляются конструктор и дружественная функция isfactorQ* Поскольку функция isfactor() дружественна для класса myclass, то функция isfactorQ имеет доступ к его закрытой части. Поэтому внутри функции isfactor() можно непосредственно ссылаться на объекты оЬл и ob.d.
Важно понимать, что дружественная функция не является членом класса, для которого она дружественна. Поэтому невозможно вызвать дружественную функцию, используя имя объекта и оператор доступа к члену класса (точку или стрелку). Например, по отношению к предыдущему примеру эта инструкция неправильна:
obi. is factor {) ; // неправильно, isfactor () — это не функция-член
Гпава 3. Подробное изучение классов.
99
На самом деле дружественная функция должна вызываться точно так же, как и обычная функция.
Хотя дружественная функция "знает" о закрытых элементах класса, для которого она является дружественной, доступ к ним она может получить только через объект этого класса. Таким образом, в отличие от функции-члена myclass, в котором можно непосредственно упоминать переменные п и d, дружественная функция может иметь доступ к этим переменным только через объект, который объявлен внутри функции или передан ей.
В предыдущем разделе был рассмотрен важный момент. Когда функция-член использует закрытый элемент класса, то это делается непосредственно, поскольку функция-член выполняется только с объектами данного класса. Таким образом, если в функции-члене класса упоминается закрытый элемент этого класса, то компилятор знает, к какому объекту этот закрытый элемент относится, поскольку знает, с каким объектом при вызове функции-члена связана функция. Однако дружественная функция не связана с каким бы то ни было объектом. Просто ей предоставлен доступ к закрытым элементам класса. Поэтому дружественная функция не может работать с закрытыми членами класса без упоминания конкретного объекта.
Поскольку дружественные функции — это не члены класса, им обычно передается один или более объектов класса, для которого они являются дружественными. Так было сделано, например, в случае с функцией isfactor() Ей был передан объект ob класса myclass. Поскольку функция isfactor() дружественна для класса myclass, она может иметь доступ к закрытым элементам этого класса через объект ob. Случись так, что функция isfactorQ не была бы дружественной для класса myclass, она не имела бы доступа ни к объекту оЬ.п, ни к объекту ob.d, поскольку переменные п и d — это закрытые члены класса myclass.
Дружественная функция — это не член класса и она не может быть задана через имя объекта. Она должна вызываться точно так же, как и обычная функция.
Дружественная функция не наследуется. Поэтому если в базовый класс включается дружественная функция, то эта дружественная функция не является таковой для производных классов.
Другим важным моментом, относящимся к дружественным функциям, является то, что функция может быть дружественной более чем к одному классу.
100 ____________ Самоучитель C++
1. Обычно дружественная функция бывает полезна Тогда, когда у двух разных классов имеется нечто общее, что необходимо сравнить. Например, рассмотрим следующую программу, в которой создаются классы саг (легковая машина) и truck (грузовик), причем оба содержат в закрытой переменной скорость соответствующего транспортного средства:
#include <iostream>
using namespace std;
class truck; // предварительное объявление
class car {
int passengers; int speed; public:
car (int p, int s) { passengers = p; speed = s; } friend int sp_greatex (carc, truck t) ;
class truck { int weight; int speed; public:
Предыдущая << 1 .. 25 26 27 28 29 30 < 31 > 32 33 34 35 36 37 .. 206 >> Следующая