友元类和友元的关系性质

友元类和友元的关系性质

友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中
的隐藏信息(包括私有成员和保护成员)。
当希望一个类可以存取另一个类的私有成员时,可以将该类声明为另一类
的友元类。定义友元类的语句格式如下:

1620662507126

经过以上说明后,类 B 的所有成员函数都是类 A 的友元函数,能存取类 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
52
53
54
55

#include<iostream>


using namespace std;
class A
{
public:
A();
~A();
//友元类,代表类B可以访问类A的私有成员和保护成员
friend class B;
private:
int a;
int b;
};

class B
{
public:
B();
~B();
void printCA(A &a) {
cout << a.a << endl;
cout << a.b << endl;
}
private:

};

B::B()
{
}

B::~B()
{
}

A::A()
{
a = 10;
b = 20;
}

A::~A()
{
}
int main(char *argv[], int argc)
{
A a1;
B b1;
b1.printCA(a1);

return 0;
}

声明位置

友元声明以关键字 friend 开始,它只能出现在类定义中。因为友元不是授
权类的 成员,所以它不受其所在类的声明区域 public private 和 protected 的影
响。通常我们 选择把所有友元声明组织在一起并放在类头之后.

友元的利弊

友元不是类成员,但是它可以访问类中的私有成员。友元的作用在于提高
程序的运 行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问
类的私有成员。 不过,类的访问权限确实在某些应用场合显得有些呆板,从而容
忍了友元这一特别语法 现象。

注意事项

(1) 友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类 B 是类 A 的友元,类 A 不一定是类B 的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类 B 是类 A 的友元,类 C 是 B 的友元,类 C 不一定 是类 A 的友元,同样要看类中是否有相应的声明。