Скачиваний:
282
Добавлен:
26.03.2015
Размер:
1.3 Mб
Скачать

122

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

Дружественные функции класса определяются вне области действия этого класса, но имеют право доступа к закрытым элементам (private и protected) данного класса. Функция или класс в целом могут быть объявлены другом (friend) другого класса. Чтобы объявить функцию как друга класса, перед ее прототипом в описании класса ставится ключевое слово friend, а объявление записывается в форме friend ClassTwo в определении класса ClassOne. Программа на рис. 16.10 демонстрирует объявление и использование дружественной функции setX для установки закрытого элемента данных x класса count. Объявление friend появляется первым в объявлении класса, даже раньше объявления закрытых функций-элементов.

//Пример использования дружественных функций

#include <iostream .h>

 

class Count {

 

friend void setX(Count &, int);

//объявление дpуга

public:

 

Count() { x = 0; }

// конструктор

void print() const {cout << x << endl; }

// вывод

private :

 

int x;

// элемент данных

};

 

void setX(count &c, int val)

 

{

 

c.x = val;

 

}

main ()

{

count object;

cout << “object.x после своего создания :”; object.print();

cout << “object.x после вызова дружественной функции setX:”; setX(object, 8); //

object.print();

return 0; }_______________________________________________________________

object.x после своего создания: 0

object.x после вызова дружественной функции setX: 8

Рис. 16.10

123

Другой пример использования дружественной функции для доступа к закрытому элементу приведен на рис.16.11. В программе используется дружественная функция SUM() для установки закрытого элемента данных sum (сумма вклада) класса Clients.

Конструктор задает закрытому элементу данных sum начальное нулевое значение. Передача параметров в дружественную функцию осуществляется по ссылке.

//Пример использования дружественной функции

#include <conio.h> #include <stdlib.h> #include <iostream.h> #include <string.h> #include <iomanip.h>

//Простой класс Clients

class Clients {

friend void SUM (Clients& , float ) ; //объявление дружественной функции public:

Clients() { sum=0; } // конструктор

// Открытые данные - элементы

int account; // номер счета

char name[20]; //массив символьных переменных void print (); // функция-элемент

private:

float sum; // закрытые данные-элементы

};

void SUM(Clients& c, float val) // описание дружественной функции

{

c.sum = val;

}

void Clients::print () // описание функции-элемента

{

cout<<endl<< "счет"<<setw(13)<<"имя"<<setw(15)<<"сумма"<<endl; cout<<setiosflags( ios::left)<<setw(14)<< account<<setw(13)<<name <<setprecision(2)<<setiosflags( ios::showpoint|ios::right)

<< sum<<endl<<endl;

}

main ( )

{

clrscr();

Clients vcladchik; // объявление объекта vcladchik cout << "Вывод объекта vcladchik после его создания :";

vcladchik.account = 1; //присвоение значения элементу данных account

Рис. 16.11

Соседние файлы в папке Книги