C++之 友元

目录

一、概念

二、全局函数做友元

三、类做友元

四、成员函数做友元


一、概念

在C++的类中,有些私有属性想要类外的特殊函数或者类进行访问,就用到友元

分类:

①全局函数做友元

②类做友元

③成员函数做友元


二、全局函数做友元

创建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;
}

C++之 友元_第1张图片

不过,若是想访问bed_room;会发现不可访问,因为卧室是私有属性C++之 友元_第2张图片

 这时,就可以用到友元将函数名整个放到类中,并在最前面加上friend

C++之 友元_第3张图片

 由此便可以访问私有属性bed_room;

C++之 友元_第4张图片


三、类做友元

首先创建Guy类和Room类,Guy类中有函数Guy和函数visit以及roomRoom类中有构造房屋函数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

C++之 友元_第5张图片

尝试访问私有权限bed_room

C++之 友元_第6张图片

 私有权限,目前不能访问

同样的,将整个类名放在类中,并在前面加上friend,表明其可以访问Room的私有属性

C++之 友元_第7张图片


四、成员函数做友元

同样的,与上面三相同的创建代码

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;

C++之 友元_第8张图片

 无法访问私有权限的bed_room;C++之 友元_第9张图片

 我们将整个函数名放在类中,记得前面加friend,中间要加Guy::表明是Guy的函数

C++之 友元_第10张图片

成功访问并输出 

你可能感兴趣的:(c++)