C++中的友元函数

什么是友元函数?

友元函数(与成员函数相对)是定义在类外部,可以访问该类中的所有私有(private)成员和保护(protected)成员。指定函数为某个类的友元函数的方法是使用关键字friend。

friend <返回类型> <函数名> (<参数列表>);

友元可以是一个函数,该函数被称为友元函数;友元也可以是一个类,该类被称为友元类,在这种情况下,整个类及其所有成员都是友元。

friend void getall(const Critter& aCritter);//注意,访问对象必须是引用

为什么需要友元函数?

1、C++中引入友元函数,是为在该类中提供一个对外(除了他自己以外)访问的窗口;
2、两个类要共享数据的时候,友元函数可以减少系统开销,调高效率;
3、运算符重载的某些场合需要使用友元函数;
4、通过友元函数,虚继承和私有构造函数可以让一个类不被继承;

友元函数注意事项

1、类中通过使用关键字friend 来修饰友元函数,但该函数并不是类的成员函数,其声明可以放在类的私有部分,也可放在共有部分。友元函数的定义在类体外实现,不需要加类限定。
2、一个类中的成员函数可以是另外一个类的友元函数,而且一个函数可以是多个类友元函数。
3、友元函数可以访问类中的私有成员和其他数据,但是访问不可直接使用数据成员,需要通过对对象进行引用。
4、友元函数在调用上同一般函数一样,不必通过对对象进行引用。
5、注意:使用友元函数破坏类的封装(尽量使用成员函数,除非不得已才使用友元函数)。

实例代码

//已知两点的坐标,求两点间距离
#include 
#include 

using namespace std;

class Point
{
public:
    Point(double xx, double yy)
    {
        x = xx;
        y = yy;
    }
    void GetXY();
    friend double Distance(Point &a, Point &b);
protected:
private:
    double x, y;
};
void Point::GetXY()
{
    cout << "(" << x << "," << y << ")" << endl;
}

double Distance(Point &a, Point &b)
{
    double length;
    length = sqrt((a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y));     //它可以引用类中的私有成员
    return length;
}

void main(void)
{
    Point p1(3.0, 4.0), p2(6.0, 8.0);
    p1.GetXY();    //成员函数的调用方法,通过使用对象来调用
    p2.GetXY();
    double d = Distance(p1, p2);     //友元函数的调用方法,同普通函数的调用一样,不要像成员函数那样调用
    cout << "distance=" << d << endl;
    return;
}

你可能感兴趣的:(c++,开发语言)