抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

友元函数和友元类

友元的对象可以是全局的一般函数,也可以是其它类里的成员函数,这种叫做友元函数。
友元还可以是一个类,这种叫做友元类,这时整个类的所有成员都是友元

demo

一、友元函数

  1. 类的友元函数定义在类的外部,但是有权访问类的所有私有成员和保护成员。但友元函数并不是成员函数。
  2. 有元函数的声明使用friend关键字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include<iostream>
#include<math.h>
using namespace std;

class Point
{
private:
double x;
double y;
public:
Point(double a,double b) //Constructor
{
x=a;
y=b;
}
int GetPoint()
{
cout<<"("<<x<<","<<y<<")"<<endl;
return 0;
}
friend double Distance(Point &a,Point &b);//声明友元函数
};

double Distance(Point &a,Point&b)
{
double xx;
double yy;
xx = a.x-b.x;
yy = a.y-b.y;
return sqrt(xx*xx+yy*yy);
}

int main()
{
Point A(2.0,3.0);
Point B(1.0,2.0);
A.GetPoint();
B.GetPoint();
double dis;
dis = Distance(A,B);
cout<<dis<<endl;
return 0;
}

运行结果

友元函数没有this指针,参数的情况;

  • 要访问非static成员时,需要对象做参数
  • 要访问static成员或全局变量时,则不需要对象做参数
  • 如果做参数的对象时全局对象,则不需要对象做参数,可直接调用友元函数,不需要通过对象或指针。

二、友元类

把一个类A声明为另一个类B的友元类,则类A中的所有成员函数都可以访问类B中的成员。在类B中声明即可。
friend class A;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include<iostream>
#include<Cmath>
using namespace std;

class Point
{
private:
double x;
double y;
public:
Point(double a,double b)//Constructor
{
x=a;
y=b;
}
int GetPoint()
{
cout<<"("<<x<<","<<y<<")"<<endl;
return 0;
}
friend class Tool;//声明友元类
};

class Tool
{
public:
double Get_x(Point &A )
{
return A.x;
}
double Get_y(Point &A)
{
return A.y;
}
double Distance(Point &A) //求一点到原点的距离
{
cout<<sqrt(A.x*A.x+A.y*A.y)<<endl;
return sqrt(A.x*A.x+A.y*A.y);
}
} ;

int main()
{
Point A(3.0,3.0);
A.GetPoint();
Tool T;
T.Get_x(A);
T.Get_y(A);
T.Distance(A);
return 0;
}

运行结果


评论