If a function is defined as a friend function in C++, then the protected and private data of a class can be accessed using the function.
By using the keyword friend compiler knows the given function is a friend function.
For accessing the data, the declaration of a friend function should be done inside the body of a class starting with the keyword friend.
class class_name { friend data_type function_name(argument/s); // syntax of friend function. };
In the above declaration, the friend function is preceded by the keyword friend. The function can be defined anywhere in the program like a normal C++ function. The function definition does not use either the keyword friend or scope resolution operator.
Characteristics of a Friend function:
Let's see the simple example of C++ friend function used to print the length of a box.
#include <iostream> using namespace std; class Box { private: int length; public: Box(): length(0) { } friend int printLength(Box); //friend function }; int printLength(Box b) { b.length += 10; return b.length; } int main() { Box b; cout<<"Length of box: "<< printLength(b)<<endl; return 0; }
Let's see a simple example when the function is friendly to two classes.
#include <iostream> using namespace std; class B; // forward declarartion. class A { int x; public: void setdata(int i) { x=i; } friend void min(A,B); // friend function. }; class B { int y; public: void setdata(int i) { y=i; } friend void min(A,B); // friend function }; void min(A a,B b) { if(a.x<=b.y) std::cout << a.x << std::endl; else std::cout << b.y << std::endl; } int main() { A a; B b; a.setdata(10); b.setdata(20); min(a,b); return 0; }
In the above example, min() function is friendly to two classes, i.e., the min() function can access the private members of both the classes A and B.
A friend class can access both private and protected members of the class in which it has been declared as friend.
Let's see a simple example of a friend class.
#include <iostream> using namespace std; class A { int x =5; friend class B; // friend class. }; class B { public: void display(A &a) { cout<<"value of x is : "<<a.x; } }; int main() { A a; B b; b.display(a); return 0; }
In the above example, class B is declared as a friend inside the class A. Therefore, B is a friend of class A. Class B can access the private members of class A.