Friend functions can be very useful in real-world programming when used appropriately. Here are a few scenarios where friend functions are effective:
A common use case for friend functions is in operator overloading. For example, overloading the <<
operator to print class objects.
#include <iostream>
class Point {
friend std::ostream& operator<<(
std::ostream &os, const Point &p);
public:
Point(int x, int y) : x{x}, y{y} {}
private:
int x, y;
};
std::ostream& operator<<(
std::ostream &os, const Point &p) {
os << "Point(" << p.x << ", " << p.y << ")";
return os;
}
int main() {
Point p(3, 4);
std::cout << p;
}
Point(3, 4)
Here, the <<
operator is overloaded to print a Point
object, accessing its private members directly.
Friend functions can be used for logging and debugging by accessing private members and providing detailed logs.
#include <iostream>
class Server {
friend void logServerState(const Server &server);
public:
Server(int activeConnections, int maxConnections)
: activeConnections{activeConnections},
maxConnections{maxConnections} {}
private:
int activeConnections;
int maxConnections;
};
void logServerState(const Server &server) {
std::cout << "Active Connections: "
<< server.activeConnections << "\n";
std::cout << "Max Connections: "
<< server.maxConnections << "\n";
}
int main() {
Server server(120, 200);
logServerState(server);
}
Active Connections: 120
Max Connections: 200
In this example, logServerState()
is a friend function that logs the private state of the Server
 class.
Friend functions can serve as helper functions that perform specific tasks which require access to the internal state of a class.
#include <iostream>
class Rectangle {
friend int calculateArea(const Rectangle &rect);
public:
Rectangle(int width, int height)
: width{width}, height{height} {}
private:
int width, height;
};
int calculateArea(const Rectangle &rect) {
return rect.width * rect.height;
}
int main() {
Rectangle rect(10, 20);
std::cout << "Area: " << calculateArea(rect);
}
Area: 200
Here, calculateArea()
is a friend function that calculates the area of a Rectangle
, accessing its private dimensions.
Friend functions can be effectively used in operator overloading, logging, debugging, and helper functions.
They provide a way to access private data without breaking encapsulation, but should be used judiciously to maintain clean and maintainable code.
Answers to questions are automatically generated and may not have been reviewed.
An introduction to the friend
keyword, which allows classes to give other objects and functions enhanced access to its members