友元函数

友元函数:

  • 为在该类中提供一个对外访问的接口
  • 友元函数不属于该类的成员函数
  • 友元函数是定义在类外的普通函数,只是在类中声明该函数可以直接访问类中的private或者protected成员

使用注意:

  • 类中通过使用关键字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
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
72
73
74
75
76
77
78
79
#include <iostream>

using namespace std;


class Home {

friend class Gay;

public:
Home(string sitting, string bed);

string SittingRoom;

private:
string BedRoom;

};


//Home::Home() {
// this->setBedRoom("卧室");
// this->setSittingRoom("客厅");
//}



class Gay {

public:
Gay(Home* h);

void visit();

Home *home{};

};

Home::Home(string sitting, string bed) {
// this->SittingRoom = sitting;
// this->BedRoom = bed;

Home::BedRoom = bed;
Home::SittingRoom = sitting;

}

Gay::Gay(Home* h) {
// this->home = new Home;



this->home = h;

// this->home = &h;
// this->home = &h;

}

void Gay::visit() {
cout << "Gay vising " << this->home->SittingRoom << endl;
cout << "Gay vising " << this->home->BedRoom << endl;
}


static void test01() {
Home hh("客厅","卧室");
Gay gay(&hh);
gay.visit();

}


int main(int argc, char *argv[]) {

test01();

return 0;
}