С++ friend дружественные функции в классах

Дружественные функции имеют доступ к закрытым членам класса функций.

Например:

 

#include <iostream>
using namespace std;
const int IDLE =0;
const int INUSE =1;
class o2; // опережающее объявлении класса, чтобы использовать ниже в дружественной функции
class o1 {
    int status;
public:
    void setStatus(int i){ status = i;}
    friend void check (o1 a, o2 b); // функция "друг" которая имеет доступ сразу к двум классам
};
class o2 {
    int status;
public:
    void setStatus(int i);
    friend void check (o1 a, o2 b);
};
void o2::setStatus(int i){
    status = i;
}
void check (o1 a, o2 b){
    // проверяем переменные из двух объектов
    if (a.status || b.status) cout << "busy"; else cout << "empty";
}
int main (){
    o1 x;
    o2 y;
    x.setStatus(IDLE);
    y.setStatus(IDLE);
    check (x,y); // вызываем функцию без привязки к объекту
    return 0;
}

Результат: empty

 

Теперь перепишем программу так, чтобы функция check стала членом класса о1, и с помощью :: объявим ее другом класса о2:

 

#include <iostream>
using namespace std;
const int IDLE =0;
const int INUSE =1;
class o2;
class o1 {
    int status;
public:
    void setStatus(int i){ status = i;}
    void check (o2 b);
};
class o2 {
    int status;
public:
    void setStatus(int i);
    friend void o1::check (o2 b);
};
void o2::setStatus(int i){
    status = i;
}
void o1::check (o2 b){
    if (status || b.status) cout << "busy"; else cout << "empty";
}
int main (){
    o1 x;
    o2 y;
    x.setStatus(IDLE);
    y.setStatus(INUSE);
    x.check (y); // вызываем с привязкой к объекту, так как в объекте о1 эта функция не является дружественной
    return 0;
}

Результат: busy

 

Функция check () является членом класса о1 и имеет прямой доступ к закрытой переменной status объектов типа о1. Поэтому в параметре мы передаем только объекты типа о2.



Оставить свой ответ:

Имя:*
E-Mail:
Вопрос:
Skolko buдет пять пдюс сeмь?
Ответ:*
QQpedia21.ru - cамые интересные вопросы