18. 友元
一、什么是友元
在程序中,有些私有成员,也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术。友元的目的就是让一个函数或者类访问另一个类中私有的成员。友元的关键字为 friend
。
二、全局函数做友元
新建一个 house.h 头文件,用来保存类的声明:
#pragma once
#include <iostream>
using namespace std;
class House
{
// goodFriend()全局函数是House类的友元,可以访问House类的私有成员
friend void goodFriend(House * house);
public:
string living_room;
private:
string bedroom;
public:
House(void);
};
新建一个 house.cpp 源文件,用来实现构造方法和成员方法:
#include "house.h"
using namespace std;
House::House(void) : living_room("客厅"), bedroom("卧室") {}
在包含 main() 函数的文件中包含刚才定义的头文件,然后使用。
#include <iostream>
#include "house.cpp"
using namespace std;
// 全局函数
void goodFriend(House * house)
{
cout << "好朋友正在访问你的:" << house->living_room << endl;
cout << "好朋友正在访问你的:" << house->bedroom << endl;
}
int main(void)
{
House house;
goodFriend(&house);
return 0;
}
三、类做友元
新建一个 good_friend.h 头文件,用来保存类的声明:
#pragma once
#include <iostream>
#include "house.h"
class House;
class GoodFriend
{
public:
void visit(House *house);
};
新建一个 good_friend.cpp 源文件,用来实现构造方法和成员方法:
#include "good_friend.h"
using namespace std;
void GoodFriend::visit(House *house)
{
cout << "好朋友正在访问你的:" << house->living_room << endl;
cout << "好朋友正在访问你的:" << house->bedroom << endl;
}
修改一个 house.h 头文件:
#pragma once
#include <iostream>
using namespace std;
class House
{
// GoodFriend是House类的友元类,可以访问本类中私有成员
friend class GoodFriend;
public:
string living_room;
private:
string bedroom;
public:
House(void);
};
在包含 main() 函数的文件中包含刚才定义的头文件,然后使用。
#include <iostream>
#include "house.cpp"
#include "good_friend.cpp"
using namespace std;
int main(void)
{
House house;
GoodFriend good_friend;
good_friend.visit(&house);
return 0;
}
四、成员函数做友元
修改一个 house.h 头文件:
#pragma once
#include <iostream>
#include "good_friend.h"
using namespace std;
class House
{
// GoodFriend类中的visit()函数是House类的友元函数,可以访问本类中私有成员
friend void GoodFriend::visit(House *house);
public:
string living_room;
private:
string bedroom;
public:
House(void);
};