Skip to main content

Friends of C++

Friend function
Remember that a member which is not public (Private and protected )  can not be accessed from outside the class. 

Three are some situations where you may need to access these. Keyword friend  is used for this. A friend functions and classes can access all members of a class. 

This concept is controversial. People say friend concept violates data encapsulation 

A friend function is a non-member function but still can access all the members of a class including private members. Such a function is declared within class body with the prefix "friend"

class Number
{
 int num;
public:
 Number(int m){/*code*/}
 friend void printNum(Number ob);/*friend function*/
};

void printNum(Number obj)
{
 cout<<obj.num<<"endl";
}

printNum() is not member of class Number. But it can still access all members including private members, because it is a friend.

Friend class

An object of a friend class can access all the members of a class.

#include<iostream>
using std::cout;
class A;
class Number
{
 int num;
public:
 Number(int a):num(a){};
 friend class A;
};
class A
{
public:
 void printNumber(Number ob){cout<<ob.num;}
 int getNumber(Number ob){return ob.num;}
};
int main()
{
 A ob1;
 Number ob2(10);
 ob1.printNumber(ob2); 
}

Output
10

ob1 - is an object of A class. So it should not be able to access private members of Number class. But as A class is declared as a friend of Number class. So printNumber() and getNumber() functions of A class can access private data num of Number class.

Declaration of class A above class Number is called forward declaration. You need to use forward declaration for friend class.


Comments

Popular posts from this blog

Ten questions in C/C++

Let us see some questions in C and C++ Write printf statement in C to print - I got 98% in Maths Can you execute a function before main() in C? If yes, how is it done? Can you write a program to find if a number is even without using modulo operator? How do you define a data member which is common to all objects of a class in C++? Can we have a single constructor for a class, but still create objects from the class passing zero/one and two parameters? What problems might occur if a class has no default constructor? Is the following statement correct? fprintf(stdout,"Hello world");   Why do we use the following statement in C++ program? using namespace std;  Can you write a single statement to check if the number is a power of 2?  What does the following statement mean in C/C++?4 if(a) b++;    So we have 10 questions. How many of these can you answer?   Do you need more questions in C and C++?    You can find t...

It is a constant

In good old days, C programmers would use preprocessor directive to define constants. e.g. #define s 10 But we know now that, as compiler never gets to see these, preprocessor statements are error prone. Hence we have const s. A constant - defined with keyword const promises that this entity is never going to change. And if we accidentally modify a const, compiler throws an error. Let us look at an example. #include<iostream> using namespace std; int main () { int a = 10 ; const int b = 12 ; a ++ ; b = 18 ; } When we compile this program, compiler tells us that default.cpp: In function ‘int main()’: default.cpp:8:7: error: assignment of read-only variable ‘b’      b = 18; So it is catching the error that we are trying to modify a const. Whenever a local variable or parameter need not be modified, declare it as a const.  Yes, we can make even parameters as constant. We can make objects constant or even me...

Abstract class

 If we can not create any objects of a class, then it is called an abstract class. A class is made abstract by adding at least one pure virtual function to it. Pure virtual function A function is said to be a pure virtual function , if it has no definition but has only declaration. Pure virtual function is defined with the keyword virtual and followed by return type, function name and "=0". class Shape { public: virtual void printarea() =0 ; }; int main () { Shape obj1; //error } Here printarea() function of Shape class is a pure virtual function as it has no body. To make a function as pure virtual function, you should use =0 at the end of virtual function declaration Abstract class When a class has at least one pure virtual function, it is incomplete and no objects can be created from that class. Such a class is called an abstract class . In the earlier example class Shape is an abstract class, and objects can not be created from t...