友元

友元

  • 在程序中,当类外特殊的一些函数或者类想要访问某些私有属性时,可以用到友元的技术,友元的目的就是让一个函数或者类访问另一个类中的私有成员

  • 友元的关键字为 friend

  • 友元的三种实现

    (1)全局函数做友元

    (2)类做友元

    (3)成员函数做友元

1. 全局函数做友元

  • 将全局函数在类中进行声明,前面加上 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
#include<iostream>
using namespace std;
class Building {
//GoodFriend是全局函数,声明为Building的友元,可以访问类中的私有成员
friend void GoodFriend(Building& building);
public:
string m_sittingRoom;
Building() {
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
private:
string m_bedRoom;
};
void GoodFriend(Building& building) {
cout << "友元函数访问公有成员m_sittingRoom:" << building.m_sittingRoom << endl;
cout << "友元函数访问私有成员m_bedRoom:" << building.m_bedRoom << endl;
}
void test01() {
Building building;
GoodFriend(building);
}
int main() {
test01();
return 0;
}

2. 类做友元

  • 语法:声明 B 是 A 的友元类,则 B 类对象成员可以访问 A 的私有属性
1
2
3
4
5
6
class A{
friend class B;
};
class 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
#include<iostream>
using namespace std;
//此处不需要提前声明 GoodFriend,因为在building中声明友元时已经指出是类,编译器也会知道GoodFriend是类
//GoodFriend类要使用Building类,则必须先定义或者声明Building类
class Building {
friend class GoodFriend;
//表明GoodFriend类是Building的友元类,GoodFriend类可以访问Building的私有成员
public:
string m_sittingRoom;
Building();
private:
string m_bedRoom;
};
class GoodFriend
{
public:
GoodFriend();//构造函数
void visit();
Building * buil;
};
//类外实现成员函数
Building::Building() {
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
GoodFriend::GoodFriend() {
buil = new Building;
}
void GoodFriend::visit() {
cout << "友元函数访问私有成员m_sittingRoom:" << buil->m_sittingRoom << endl;
cout << "友元函数访问私有成员m_bedRoom:" << buil->m_bedRoom << endl;
}
void test01() {
GoodFriend myfriend;
myfriend.visit();
}
int main() {
test01();
return 0;
}

3. 成员函数做友元

  • 先定义的类的成员函数作为后定义的类的友元函数,或者提前声明好避免出错

示例:

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
#include<iostream>
using namespace std;
class Building;//提前声明要用到的类
class GoodFriend
{
public:
GoodFriend();//构造函数
void visit();
Building* building;
};
class Building {
friend void GoodFriend::visit();
public:
string m_sittingRoom;
Building();
private:
string m_bedRoom;
};

//类外实现成员函数
Building::Building() {
m_sittingRoom = "客厅";
m_bedRoom = "卧室";
}
GoodFriend::GoodFriend() {
building = new Building;
}
void GoodFriend::visit() {
cout << "友元函数访问私有成员m_sittingRoom:" << building->m_sittingRoom << endl;
cout << "友元函数访问私有成员m_bedRoom:" << building->m_bedRoom << endl;
}
void test01() {
GoodFriend myfriend;
myfriend.visit();
}
int main() {
test01();
return 0;
}