Дружественные функции


Дружественные функции похожи, но более безопасны, чем дружественные классы. Объявление функции дружественной классу дает ей доступ к закрытым и защищенным членам класса.

// Программа 2 Пример объявления дружественной функции

#include <iostream.h>

class Two;

class One {

friend void Show(One& c1, Two& c2);//Дружественная функция

private: //двум классам

char *s1;

public:

One() { s1 = "Testing "; }

};

class Two {

friend void Show(One& c1, Two& c2);

private:

char *s2;

public:

Two() { s2 = "one, two, three"; }

};

void main()

{

One c1;

Two c2;

Show(c1,c2);

}

void Show(One& c1, Two& c2)

{

cout << c1.s1 << c2.s2 << endl;

}

Неполное объявление класса Two позволяет в классе One ссылаться на класс Two.

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

// Программа 3

#include <iostream.h>

class One;

class Two {

private:

char *s2;

public:

Two() { s2 = "one, two, three"; }

void Show(One& c1);

};

class One {

friend void Two::Show(One& c1);// Дружественная функция-

// член

private:

char *s1;

public:

One() { s1 = "Testing "; }

};

void main()

{

One c1;

Two c2;

c2.Show(c1);

}

void Two::Show(One& c1)

{

cout << c1.s1 << s2 << endl;

}

Порядок объявления классов изменился, так как класс в котором содержиться прототип функции должен быть объявлен раньше, чем класс, в котором функция объявлена дружествен-ной.