3-C++程序的结构1.3

类的友元

一个类之外的函数,又与该类有特殊关系!

友元关系提供了不同类或对象的成员函数之间、类的成员函数与一般函数之间进行数据共享的机制。通俗地说,友元关系就是一个类主动声明那些其他类或函数是它的朋友,进而给他们提供对本类的访问特许。

在一个类中,可以利用关键字friend将其他函数或类声明为友元。如果友元是一般函数或类的成员函数,称为友元函数;如果友元是一个类,则称为友元类。友元类的所有成员函数都自动成为友元函数。

1、友元函数

友元函数时在类中用关键字friend修饰的非成员函数。友元函数可以是一个普通函数,也可以是一个其他类的成员函数。虽然它不是本类的成员函数,但是在它的函数体中可以通过对象名访问类的私有和保护成员。

通过友元函数计算任意两点之间的距离

#include<iostream>
#include<cmath>
using namespace std;
class Point //Point类定义
{
public:
Point(int xx=0,int yy=0){X=xx;Y=yy;} //构造函数
int GetX(){return X;}
int GetY(){return Y;}
friend float fDist(Point &a,Point &b);//友元函数声明

private:
int X,Y;
};

float fDist(Point &p1,Point &p2)
{
double x=double(p1.X-p2.X);
double y=double(p1.Y-p2.Y);
return float(sqrt(x*x+y*y));
}
int main()
{
Point myp1(1,1),myp2(4,5);
cout<<"The distance is:";
cout<<fDist(myp1,myp2)<<endl;

return 0;
}

2、友元类

同友元函数一样,一个类可以将另一个类声明为友元类。若A类为B类的友元类,则A类的所有成员函数都是B类的友元函数,都可以访问B类的私有和保护成员。语法形式如下:

class B

{

  ...

  friend class A; //声明A为B的友元类

  ...

};

声明友元类是建立类与类之间数据共享的一种途径。

class A

{

  public:

    void Display(){cout<<x<<endl;}

    int Getx(){return x;}

    friend class B;//B类是A类的友元函数

    private:

      int x;

}

class B

{

  public:

    void Set(int i);

    void Display();

  private:

    A a;

}

void B::Set(int i)

{

  a.x=i;//由于B是A的友元,所以在B的成员函数中可以访问A类对象的私有成员

}

在下一章中,将利用友元类来实现矩阵计算。

关于友元,还有几点需要注意:a、友元关系是不能传递的;b、友元关系是单向的;c、友元关系是不被继承的,如果B类是A类的友元,类B的派生类并不会自动成为类A的友元。

原文地址:https://www.cnblogs.com/gary-guo/p/6214434.html