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

Можно создать функцию, которая не является членом класса, но внутри которой будет доступ ко всем членам класса, в том числе к закрытым и защищенным. Такая функция называется дружественной. Чтобы объявить функцию дружественной следует разместить прототип функции, перед которым указано ключевое слово 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;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов