友元

C++封装的类增加了对类中数据成员的访问限制,从而保证了安全性。如想访问类中的私有成员需要通过类中提供的公共接口来访问,这样间接的访问方式,无疑使得程序的运行效率有所降低。

友元的提出可以使得类外的函数来访问类中的私有成员,保护成员。

友元的使用分为三类:

1.类外的普通函数声明为该类的友元函数。

格式: friend 类型 函数名(形参)

2.其他类的成员函数声明为该类的友元函数。

格式:friend 类型 类名::函数名(形参)

3.其他类为该类的友元类,这样类中的所有成员函数都是该类的友元函数。

格式:friend class 类名

代码演示:

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>

using namespace std;

class A;

class B
{
public:
//类B的成员函数为类A的友元函数
void display(A &a);
};

class C
{
public:
//类C是类A的友元类
void display(A &a);
};

class A
{
public:
A(int i):x(i){}

int getX()
{
return x;
}

friend void display(A &a);
friend void B::display(A &a);
friend C;

private:
int x;
};

//类外普通函数为类A的友元函数
void display(A &a)
{
cout << a.x << endl; //友元函数直接访问类中的私有成员
}

void B::display(A &a)
{
cout << a.x << endl;
}

void C::display(A &a)
{
cout << a.x << endl;
}

int main()
{
A a(18);

//无法直接访问类A的私有变量x,需要通过对外提供的函数来访问
cout << a.getX() << endl;

//类B的成员函数为类的A的友元函数
B b;
b.display(a);

//类C是类A的友元类
C c;
c.display(a);

return 0;
}

###总结:

1.友元声明在类中,但并不属于该类的成员。

2.友元的关系不能继承。

3.在类的任何位置声明友元都行,不受访问权限限制。

4.友元关系提高了程序效率,但破坏了数据的安全性。慎重使用。

5.友元的关系是单向。如类B是类A的友元,反过来类A不一定是类B的友元,看类B中是否有声明。

# 友元

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×