OOPortal OOPortal


Operator Overloading  «Prev  Next»
Lesson 5 Why friend functions are needed
Objective Write two add() functions for the matrix class

Why friend Functions are needed in C++

Write two add() functions to the matrix class
  1. one a friend function and
  2. the other a member function
and explain the advantages of defining one over the other.
The keyword friend is a function specifier and gives a non-member function access to the hidden members of the class, and provides a method of escaping the data hiding restrictions of C++. However, you must have a good reason for escaping these restrictions, as they are both important to reliable programming.

There are two reasons why you might use a friend function:
  1. Some functions need privileged access to more than one class. For example, we want to write a function that multiplies a matrix by a vector.
  2. All friend functions pass all their arguments through the argument list, and each argument value is subject to assignment-compatible conversions.
    Here is an example of this situation.
Conversions would apply to an object passed explicitly and would be especially useful in cases of binary operator overloading, as we will see a bit later in this module.



Friends must be explicitly declared as part of class definition

The modifiers
  1. private,
  2. protected, and
  3. public
give the programmer control over access to names, which implicitly gives the programmer control over access to their associated data values. However, the three possibilities of public, protected, and private cannot cover all situations. Frequently a programmer would like to make a data field or member function accessible to another function or another class that is not a derived class, and to do so without making the name accessible in a public fashion. The solution in this case is to declare a friend.
A friend can be either another class or a function. The friend must be explicitly named within a class definition. By naming the friend, the class is granting access to all the private features of the class. Declaring a class as friend means that all member functions in the friend class are friends. Needless to say, this is a dangerous mechanism because it exposes the encapsulated state of a class to outside modification. Friendship is not something that should be given away freely. But because friends are named, and because friends are allowed direct access to internal data fields, friendship is a more precise and efficient mechanism than, for example, the creation of accessor functions[1] .

class ClassName{
...
friend class ClassName;
friend return_type function_name(parameter list);
};

Friend Function - Exercise

Click the Exercise link below to write two add() functions to the matrix class.
  1. one a friend function and
  2. the other a member function
and explain the advantages of defining one over the other.
Friend Function - Exercise

[1]accessor functions: Member functions that are public are called accessor functions when they do not change the object's data.