5.24_C++

1、用途

在不放弃私有成员(或保护成员)数据安全性的情况下,使得一个普通函数或者类的成员函数可以访问到封装于某一类中的信息(私有、保护成员)

2、友元函数

  1. 分类
    1. 一个不属于任何类的普通函数声明为当前类的友元,称为当前类的友元函数
    2. 一个其他类的成员函数声明为当前类的友元,称为当前类的友元成员
  2. 友元函数不是当前类的成员函数,而是独立于当前类的外部函数,但它可以访问该类的所有对象的成员,包括私有成员、保护成员和公有成员。
  3. 示例
//友元函数
#include<iostream>
#include<cmath>
using namespace std;
class Point
{
       int x, y;
    public:
        Point(int a=0, int b=0)
        {    x=a; y=b;    }
        ~Point()  {  }
        void Show ( )
        {    cout<<”x=”<<x<<” y=”<<y<<endl;     }
        int Get_x()
        {    return x;    }
        int Get_y()
        {   return y;   }
        friend double Distance(Point &p1, Point &p2);  //友元函数声明
};
double Distance(Point &p1, Point &p2)   //友元函数定义
{
	return  sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int main()
{ 
	Point p1, p2(1,1);
	cout<<Distance(p1,p2)<<endl;
	return 0;
}
//友元成员
#include<iostream>
using namespace std;
     class N;       //N类的前向说明,因为N的定义在M之后,而M中使用了N
     class M
{
        int a, b;
    public:
      M(int x, int y)
      {    a=x; b=y;    }
      void Print()
      {     cout<<”a=”<<a<<” b=”<<b<<endl;    }
      void Setab(N &);
};
class N
{
      int c, d;
  public:
    N(int a, int b)    { c=a; d=b; }
    void Print( )   { cout<<”c=”<<c<<” d=”<<d<<endl;  }
    friend void M::Setab(N&);   //将M类的成员函数说明为本类的友元函数
};
void M::Setab(N &obj)    //M类的成员函数Setab()是类N的友元函数
{
	a=obj.c;            //在Setab()中可以直接访问类N的私有成员
	b=obj.d;
}

3、友元类

1、当一个类作为另一个类的友元时,则该类中的所有成员函数都是另一个类的友元成员,都可以访问另一个类的所有成员。
2、示例

#include<iostream>
using namespace std;
class B;       // 前向说明,因为在后面定义的A类中用到B类
class A
{
 	int x;
    public: 
	A(int a)
	{     x=a;    }
  	friend class B;  //将类B声明为类A的友元类
};
class B
{
     public:
         void Show(A&  a)
         {     cout<<”x=”<<a.x<<endl;  }
};
Tags

No responses yet

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注