友元函数的例子 (友元函数)

我们知道,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()函数,以查看计算结果。

需要注意的是,虽然友元函数可以访问类的私有成员变量,但这并不意味着它们应该被广泛使用。友元函数可以破坏封装性,并使代码更难以理解和维护。因此,应该尽可能地使用成员函数来访问和修改类的私有成员变量,只在必要时使用友元函数。