我们知道,C++控制对类对象私有部分的访问。通常,公有类方法提供唯一的访问途径。但是友元函数缺是可以直接访问类的私有成员的非成员函数,它是定义在类外的普通函数,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字friend。友元函数不是类的成员函数,它在类外定义时和普通函数一样不用加“::”来声明作用域。友元函数不能访问类的成员,只能访问我们对象的成员。
特点:
- 提高了程序的运行效率
- 破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员
- 友元关系没有继承性,即子类不继承父类的友元函数,也就是不能使用子类的友元函数
友元函数通常与运算符重载一起使用,以便它们可以访问私有成员变量,并以更自然的方式执行运算。例如,一个类可能定义一个名为“Point”的坐标点,其中包含x和y坐标。如果您希望能够使用运算符“+”将两个点相加,您可以使用友元函数来实现此功能。
以下是一个简单的示例,说明如何在C++中使用友元函数:
#include <iostream>
using namespace std;
class Point {
private:
int x, y;
public:
Point(int x = 0, int y = 0) {
this->x = x;
this->y = y;
}
friend Point operator+(const Point&, const Point&);
void display() {
cout << "x = " << x << ", y = " << y << endl;
}
};
Point operator+(const Point& p1, const Point& p2) {
Point p;
p.x = p1.x + p2.x;
p.y = p1.y + p2.y;
return p;
}
int main() {
Point p1(1, 2), p2(3, 4);
Point p3 = p1 + p2;
p3.display();
return 0;
}
在这个例子中,我们定义了一个名为“Point”的类,它包含了x和y坐标,并定义了一个名为“operator+”的友元函数。这个函数接受两个“Point”对象并返回它们的和。我们在类外部定义了这个函数,并将其声明为“Point”类的友元。这使得“operator+”函数可以访问Point类的私有成员变量。
在主函数中,我们创建两个Point对象p1和p2,并使用“+”运算符将它们相加,得到另一个Point对象p3。我们调用p3的display()函数,以查看计算结果。
需要注意的是,虽然友元函数可以访问类的私有成员变量,但这并不意味着它们应该被广泛使用。友元函数可以破坏封装性,并使代码更难以理解和维护。因此,应该尽可能地使用成员函数来访问和修改类的私有成员变量,只在必要时使用友元函数。