目录
1 友元
1.1 概念
在C++的类中,有些私有属性想要类外的特殊函数或者类进行访问,就用到友元
1.2 分类
1.2.1 全局函数做友元
创建home
类与测试函数test01
;类中加上私有属性bed_room
并赋值为卧室,加上公共属性sitting_room
并赋值为客厅,尝试打印输出
class home
{
public:
home()
{
sitting_room = "客厅";
bed_room = "卧室";
}
public:
string sitting_room;
private:
string bed_room;
};
void test01(home room)
{
cout << "正在访问->" << room.sitting_room << endl;
}
不过,若是想访问bed_room
;会发现不可访问,因为卧室是私有属性
这时,就可以用到友元,将函数名整个放到类中,并在最前面加上friend
。
由此便可以访问私有属性bed_room
;
1.2.2 类做友元
首先创建Guy
类和Room
类,Gu
y类中有函数Guy
和函数visit
以及room
;Room
类中有构造房屋函数Room
以及私有房屋bed_room
公共房屋sitting_room
;
class Room;
class Guy
{
public:
Guy();
void visit(); // 访问Room中的属性
Room* room;
};
class Room
{
public:
Room();
string sitting_room;
private:
string bed_room;
};
Room::Room()
{
bed_room = "卧室";
sitting_room = "客厅";
}
Guy::Guy()
{
room = new Room; // 创建屋子对象
}
void Guy::visit()
{
cout << "正在访问" << room->sitting_room << endl;
cout << "正在访问" << room->bed_room << endl;
}
void test()
{
Guy f;
f.visit();
}
在test
中使用Guy
函数创建对象f
(创建时调用Guy
函数,会new
一个Room
出来,又调用了Room
函数,初始化了sitting_room和bed_room
),再使用对象f调用函数visit
,visit
函数则会访问sitting_room
尝试访问私有权限bed_room
;
私有权限,目前不能访问。
同样的,将整个类名放在类中,并在前面加上friend
,表明其可以访问Room
的私有属性
1.2.3 成员函数做友元
同样的,与上面三相同的创建代码
class Room;
class Guy
{
public:
Guy();
void visit();
Room* room;
};
class Room
{
friend void Guy::visit();
public:
Room();
public:
string sitting_room;
private:
string bed_room;
};
Room::Room()
{
this->bed_room = "卧室";
this->sitting_room = "客厅";
}
Guy::Guy()
{
room = new Room;
}
void Guy::visit()
{
cout << "正在访问 " << room->sitting_room << endl;
cout << "正在访问 " << room->bed_room << endl;
}
void test()
{
Guy g;
g.visit();
}
此时能输出公共权限的sitting_room
;
无法访问私有权限的bed_room
;
我们将整个函数名放在类中,记得前面加friend
,中间要加Guy::
表明是Guy
的函数
成功访问并输出