1) A friend function allows access to private and protected members of a class. It is declared inside the class using the keyword "friend". 2) A friend function is not a member function - it is defined outside of the class and does not have access to non-static members using the class object. However, it can access private and protected members of the class. 3) In the example, the Temperature class declares the temp function as a friend. This allows temp to directly access and modify the private celsius member, something that regular non-member functions cannot do. The friend declaration gives temp special access privileges.