Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5fan_ru_Obektno-orientirovannoe_programmirovan...doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
351.74 Кб
Скачать

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

Дружественная функция при вызове не получает указателя this. Объекты классов должны передаваться дружественной функции только явно через аппарат параметров. При вызове дружественной функции нельзя использовать синтаксис вызова функций – методов класса:

Имя объекта. Имя_функции

и

указатель_на_объект ->имя_функции,

так как дружественная функция не является методом класса. Именно поэтому на дружественную функцию не распространяется и действие спецификаторов доступа (public, private, protected). Место размещения прототипа дружественной функции внутри определения класса безразлично. Права доступа дружественной функции не изменяются и не зависят от спецификаторов доступа.

Использование механизма дружественных функций позволяет упростить интерфейс между классами. Например, можно сделать все функции класса Y друзьями класса X в одном объявлении, например:

class Y

{.....

Void f1( X& );

Void f2 ( X* );

.....

};

class X

{

friend Y; // все функции класса Y являются друзьями класса X

int i;

void f3 ( ); // функции f1 и f2 класса Y являются друзьями класса X

// и имеют доступ к private элементам i и f3 класса X

};

4.4. Перегрузка операций >>и << для ввода-вывода встроенных типов

В файле <iostream.h> определены классы ostream и istream, в которых объявлены функции-операторы как методы классов, перегружающие действие побитовых операций >> и << для организации неформатированного ввода и вывода данных базовых типов языка С++.

Класс istream определен как:

class istream

{

// .....

public:

istream & operator >> ( char * ); //символьная строка

istream & operator >> ( char & ); //символ

istream & operator >> (short & );

istream & operator >> ( int & );

istream & operator >> ( long & );

istream & operator >> ( float & );

istream & operator >> (double &);

// …

}

Класс ostream определен как:

class ostream

{

//.....

public:

ostream & operator << ( char * );

ostream & operator << ( int );

ostream & operator << ( long );

ostream & operator << ( double );

ostream & put ( char * );

}

Такая перегрузка операций позволяет программисту организовывать ввод типов данных базовых типов единообразно. В зависимости от типа данного компилятор связывает вызов функции-оператора с соответствующим определением.

4.5. Перегрузка операций >> и << для ввода, вывода типов, объявленных пользователем

Очень полезным примером применения механизма перегрузки операций и функций-друзей классов является использование операций >> и << для ввода, вывода типов, объявленных пользователем. . В качестве примера в листинге 4.3 приведена модифицированная версия программы из листинга 4.2, в которой операции >> и << перегружены с помощью дружественных функций.

Листинг 4.3

#include <iostream.h>

class V_3d

{

int x,y,z;

public:

//конструктор по умолчанию

V_3d(){x=0;y=0;z=0;};

//конструктор, принимающий параметры

V_3d(int x1,int y1,int z1)

{

x=x1;y=y1;z=z1;

};

//функция друг для вывода вектора

friend ostream &operator <<(ostream &stream, V_3d obj);

//функция друг для ввода вектора

friend istream &operator >>(istream &stream, V_3d &obj);

// функция-друг для перегрузки +

friend V_3d operator +(V_3d op1, V_3d op2);

// функция-друг для перегрузки ++

friend V_3d operator ++(V_3d &op1);

// функция для перегрузки =

V_3d operator =( V_3d t);

};

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