Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Дружественные функции и классы
Можно создать функцию, которая не является членом класса, но внутри которой будет доступ ко всем членам класса, в том числе к закрытым и защищенным. Такая функция называется дружественной. Чтобы объявить функцию дружественной следует разместить прототип функции, перед которым указано ключевое слово friend
, внутри объявления класса. Одним из параметров дружественной функции должен быть экземпляр класса или ссылка на него, чтобы иметь возможность изменять значения полей в переданном объекте. Пример создания дружественной функции приведен в листинге 13.15.
Листинг 13.15. Дружественные функции
#include <iostream>
class C {
int x_; // Закрытое поле
public:
explicit C(int x) { x_ = x; }
int getX() { return x_; }
// Объявление дружественной функции
friend int func(C &obj, int x);
};
// Дружественная функция
int func(C &obj, int x) {
obj.x_ += x; // Можно изменить значение закрытого поля
return obj.x_;
}
int main() {
C obj(10);
std::cout << func(obj, 10) << std::endl; // 20
std::cout << obj.getX() << std::endl; // 20
return 0;
}
Сделать другом можно не только отдельную функцию, но и метод какого-либо класса. Если в одном классе дружественных методов несколько, то вместо объявления отдельных методов допускается объявить сразу весь класс дружественным. В этом случае все методы класса считаются дружественными. Чтобы объявить класс дружественными следует разместить неполное объявление класса, перед которым указано ключевое слово friend
, внутри объявления другого класса (листинг 13.16).
Листинг 13.16. Дружественные классы
#include <iostream>
class A {
int x_, y_; // Закрытые поля
public:
A(int x, int y) { x_ = x; y_ = y; }
friend class B; // Объявление дружественного класса
};
class B {
public:
int getX(A &obj) { return obj.x_; }
int getY(A &obj) { return obj.y_; }
};
int main() {
A a(20, 50);
B b;
std::cout << b.getX(a) << std::endl; // 20
std::cout << b.getY(a) << std::endl; // 50
return 0;
}
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов