Быть friend
класса X
означает, что друг (будь то функция или класс) имеет доступ ко всем закрытым и защищенным членам класса X
.
В вашем примерекласс Foobar
и функция fcn
имеют доступ к закрытым и защищенным членам класса Bar
.
Теперь вопрос:
как он может получить к ним доступэто если не получило никакого объекта Bar, переданного в качестве параметра?
Ну, он может получить доступ, если у него есть экземпляр Bar
.Например.
void fcn()
{
Bar<int> bar;
bar.PrivateFun(); //okay even if PrivateFun is a private function of Bar
bar.PrivateData = 10; //okay even if PrivateData is a private data of Bar
}
Чтобы подчеркнуть разницу, рассмотрим следующую функцию:
void g()
{
Bar<int> bar;
bar.PrivateFun(); //compilation error - g() is not a friend of Bar!
bar.PrivateData = 10; //compilation error - g() is not a friend of Bar!
}
Надеюсь, это поможет вам понять, что значит иметь доступ к закрытым членам класса,и что значит быть friend
класса!