Logo F2FInterview

C++ Interview Questions

Q   |   QA

Friend functions are not a part of the class and are external. This function is a “Friend” of a class. This is to say, it has special privileges to access to the class's private and protected members.

To allow a non-member function the access to private members of a class, it needs to be friend of that class. Friend functions can access private and protected data of the class. To make a non-member function friend of a class, its declaration needs to be made inside the class and it has to be preceded by the keyword friend. We can also have a member function of a class to be friend of certain other class. Even if a function is not a member of any class, it can still be friend of multiple classes.

If we write equivalent friend function for a member function, then friend function has one extra parameter because being a non-member of the class, it does not have the caller object. Therefore, it does not have this pointer.

Friend functions are very useful for overloading certain types of operators. They also make creation of some type of I/O functions easier.

Consider following example of class 3D having data members x, y and z. Overloaded binary operator * for scalar multiplication. It should work in both cases:

ob1 = ob2 * 3;
ob1 = 3 * ob2;

Note that first can be achieved through member or friend function. But for the second case we need to write friend function since there is no caller object.

class 3D
{
int x, y, z;
public:
3D (int a=0, int b=0, int c=0)
{
x = a;
y = b;
z = c;
}
3D show()
{
cout<<”The elements are:\n”
cout<<”x:”<<this->x<<”, y:<<this->y <<”, z:”<<this->z;
}
friend 3D operator * (3D, int);
friend 3D operator * (int, 3D);
};

3D operator * (3D ob, int i) //friend function’s definition is written outside class
{
3D tob;
tob.x = ob.x * i;
tob.y = ob.y * i;
tob.z = ob.z * i;
return tob;
}

3D operator * (int i, 3D ob) //friend function’s definition is written outside class
{
3D tob;
tob.x = ob.x * i;
tob.y = ob.y * i;
tob.z = ob.z * i;
return tob;
}

int main()
{
3D pt1(2,-4,5), pt2, pt3;
pt 2 = pt1 * 3;
pt3 = -2 * pt1
cout << “\n Point one’s dimensions are: \n“<<pt1.show();
cout << “\n Point two’s dimensions are: \n“<<pt2.show();
cout << “\n Point three’s dimensions are: \n“<<pt3.show();
return 0;
}

The o/p would be:
Point one’s dimensions are:
x:2, y:-4, z:5
Point two’s dimensions are:
x:6, y:-12, z:15
Point three’s dimensions are:
x:-4, y:8, z:-10

Thus, friend functions are useful when we have to overload operators which have no caller object. 

There are situations when private data members need to be accessed and used by 2 classes simultaneously. In these kind of situations we can introduce friend functions which have an access to the private data members of both the classes. Friend functions need to be declared as ‘friend’ in both the classes. They need not be members of either of these classes.

A friend class and all its member functions have access to all the private members defined within other class.

#include <iostream>
using namespace std;
class Numbers
{
    int a;
    int b;
    public:
           Numbers(int i, int j)
           {
                     a = i;
                     b = j;
           }
           friend class Average;
};

class Average
{
       public:
             int average(Numbers x);
};

int Average:: average(Numbers x)
{
           return ((x.a + x.b)/2);
}

int main()
{
         Numbers ob(23, 67);
         Average avg;
         cout<<”The average of the numbers is: ”<<avg.average(ob);
         return 0;
}

Note the friend class member function average is passed the object of Numbers class as parameter.

When the application is needed to access a private member of another class, the only way is to utilize the friend functions. The following are the guidelines to handle friend functions.

  • Declare the function with the keyword ‘friend’ that is followed by return type and followed by the function name.
  • Specify the class whose private members are to be accessed in the friend function within parenthesis of the friend function.
  • Write the code of the friend function in the class.

The following code snippet illustrates the use of friend function:

friend void display(car); //Friend of the class 'car'

void display(car myCar)
{
      cout<<"\nThe color of my car is : "<<myCar.color;
      cout<<"\nThe speed of my car is : "<<myCar.speed;
}

In order to link this F2FInterview's page as Reference on your website or Blog, click on below text area and pres (CTRL-C) to copy the code in clipboard or right click then copy the following lines after that paste into your website or Blog.

Get Reference Link To This Page: (copy below code by (CTRL-C) and paste into your website or Blog)
HTML Rendering of above code: