😁友元的简介
类的主要特点之一是数据隐藏,即类的私有成员无法在类的外部作用域之外访问,但是,有时候需要在类的外部访问类的私有成员,这个时候就需要使用友元函数。
友元函数是一种特权函数,c++允许这哥特权函数访问私有成员,这一点从现实生活中也可以很好的理解,比如你的加,有客厅,有你的卧室,那么你的客厅是 public 的,所有来的人都可以进去,但是你的卧室是私有的,也就是说你能进去,但是你也可以允许你的闺蜜和好友进去。因此,我们可以把一个全局函数、某一个类中的成员函数、甚至整个类声明为 友元。
😁友元的语法
使用 friend 关键字声明友元。
friend 关键字只出现在声明处,一个函数或者类作为了另一个类的友元,那么这个函数或者类就可以直接访问另一个类的私有数据
友元主要用在运算符重载上
😁普通全局函数作为类的友元
全局函数访问 Room 类的私有属性编译报错
设置普通全局函数作为类的友元
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Room
{
friend void visit(Room &room);
private:
string bedRoom; //卧室
public:
string setingRoom; //客厅
public:
Room(string bedRoom,string setingRoom){
this->bedRoom = bedRoom;
this->setingRoom = setingRoom;
}
};
//全局函数
void visit(Room &room){
cout<<"访问了:"<<room.setingRoom<<endl;
cout<<"访问了:"<<room.bedRoom<<endl;
}
int main(int argc, char *argv[])
{
Room room("卧室","客厅");
visit(room);
return 0;
}
编译成功
😁类的成员函数作为另一个类的友元
#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
class Room;
class Person{
public:
void p_visit_1(Room &room);
void p_visit_2(Room &room);
};
class Room
{
friend void Person::p_visit_1(Room &room);
friend void Person::p_visit_2(Room &room);
private:
string bedRoom; //卧室
public:
string setingRoom; //客厅
public:
Room(string bedRoom,string setingRoom){
this->bedRoom = bedRoom;
this->setingRoom = setingRoom;
}
};
void Person::p_visit_1(Room &room)
{
cout<<"访问了:"<<room.setingRoom<<endl;
cout<<"访问了:"<<room.bedRoom<<endl;
}
void Person::p_visit_2(Room &room)
{
cout<<"访问了:"<<room.setingRoom<<endl;
cout<<"访问了:"<<room.bedRoom<<endl;
}
int main(int argc, char *argv[])
{
Room room("卧室","客厅");
Person p1;
p1.p_visit_1(room);
p1.p_visit_2(room);
return 0;
}
另一个类的成员函数作为当前类的友元
编译成功!
😁整个类作为友元
上面的代码如果另一个类的成员函数作为当前类的友元比较麻烦,因此可以直接将整个类作为当前类的友元
😱注意事项
友元关系不能被继承
友元关系是单向的,类 A 是类 B 的朋友,但是 类 B 不一定是 类 A 的朋友‘’
友元关系不具有传递性,类 B 是 类 A 的朋友,类 C 是 类 B 的朋友,但是 类 C 不一定是 类 A 的朋友