С++ friend дружественные функции в классах
Компьютеры / Программирование / C++ (язык С)
Тэги: язык С основы язык С классы язык С friend
Тэги: язык С основы язык С классы язык С friend
📅27-10-2018 👁331
Дружественные функции имеют доступ к закрытым членам класса функций.
Например:
#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.
Оставить свой ответ: