Easyfriend
Что такое friend-класс и friend-функция?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
friend объявление даёт другой функции/классу доступ к private/protected членам. friend нарушает инкапсуляцию направленно — но только указанным friends.
class Account {
double balance_;
friend class Auditor; // класс-друг: полный доступ
friend void transfer(Account&, Account&, double); // функция-друг
public:
friend std::ostream& operator<<(std::ostream& os, const Account& a) {
return os << a.balance_; // hidden friend
}
};- Применение: operator overloading (особенно
<<для ostream), тесно связанные классы (Iterator для Container), unit tests, hidden friends; - friend не симметричен (Foo friend Bar ≠ Bar friend Foo) и не транзитивен (внук не наследует friendship);
- В новом коде friend — для операторов и tight coupling, в остальном — публичный интерфейс.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.