Поделиться через


Дружественные объявления

При объявлении дружественной функции, которая не была объявлена ранее, эта функция экспортируется во включающую область вне класса.

Функции, объявленные в объявлении friend, обрабатываются так, как если бы они были объявлены с ключевым словом extern. (Дополнительные сведения о ключевом слове extern см. в разделе Статические спецификаторы класса хранения.)

Хотя функции с глобальной областью действия могут быть объявлены как дружественные до объявления своих прототипов, функции-члены не могут быть объявлены как дружественные функции до полного объявления их класса. В следующем коде показано, почему при этом возникает ошибка.

class ForwardDeclared;   // Class name is known.
class HasFriends
{
    friend int ForwardDeclared::IsAFriend();   // C2039 error expected
};

В предыдущем примере в области действия вводится имя класса ForwardDeclared, но полное объявление — в частности, часть, в которой объявляется функция IsAFriend, — отсутствует. Поэтому объявление friend в классе HasFriends вызывает ошибку.

Чтобы объявить два класса как дружественные друг другу, весь второй класс должен быть указан как дружественный для первого класса. Причина такого ограничения заключается в том, что компилятор получает достаточные сведения для объявления отдельных дружественных функций только в момент объявления второго класса.

Примечание

Хотя весь второй класс должен быть дружественным для первого класса, можно выбрать, какие функции первого класса будут дружественными для второго класса.

См. также

Ссылки

friend (C++)