c++中的友元的相关知识

c++中的友元

c++中创建类的时候会有公共权限、保护权限、私有权限。往往是访问不到一个类中私有权限中内容的。
在程序中,有些私有属性 也想让类外特殊的一些函数或者类进行访问,就需要用到友元的技术,这样一来两个类就可以共享数据。节省内存空间。 如果友元是一般成员函数或者类的成员函数,则称为友元函数,如果友元是一个类则称为友元类。友元类中所有的成员函数都是友元函数。接下来会分别介绍。
友元的目的:就是让一个函数或者类 访问另一个类中私有成员 友元的关键字为 friend

友元的三种实现:

1、全局函数做友元
2、类做友元
3、 成员函数做友元

1>、全局函数做友元

#include<iostream>
using namespace std;
#include<string>
class Building {
	friend void familynumber(Building *building);//只要写在类内即可
public:
	Building() {
	
		this->m_BedRoom = "卧室";
		this->m_SittingRoom = "客厅";
	
	}

public:
	string m_SittingRoom;
private:
	string m_BedRoom;

};

//类外创建一个全局函数实现访问类内的私有、公共的成员变量
void familynumber(Building *building) {
	cout << "家人进入房间的客厅" << building->m_SittingRoom << endl;
	cout << "家人进入房间的卧室" << building->m_BedRoom << endl;//如果不在上面的类中加入友元函数的声明就会报错。

}

void test01() {
	//创建一个对象
	Building b;
	familynumber(&b);

}
int main() {
	test01();
	system("pause");
	return 0;


}

2、类做友元

一个类可以访问另外一个类中的私有成员。

//类做友元函数,创建两个类,用其中一个类去访问另外一个类中的私有成员
//下面写一个实例,创建一个父亲类、一个房间类,父亲类可以访问房间中的卧室私有属性
class Building;//在前面声明一下,要不然会报错
class Father {
	
public:
	Father();
	 void visit();

private:
	Building  *building;
};

class Building {
	friend class Father;//家人类要想访问房屋类中卧室这个私有属性,需要用到友元函数
public:
	Building();

public:
	string m_sittingRoom;
private:
	string m_BedRoom;

};

//在类外写成员函数,前面加上成员函数的类名称和作用域
Building::Building() {

	//给属性赋初值
	this->m_sittingRoom = "客厅";
	this->m_BedRoom = "卧室";

}
//在类外写成员函数,前面加上成员函数的类名称和作用域
Father::Father() {
	//利用指针创建一个建筑物对象

	building = new Building;
}
//在类外写成员函数,前面加上成员函数的类名称和作用域
void Father::visit() {

	cout << "家人访问" << building->m_sittingRoom << endl;

	cout << "家人访问" << building->m_BedRoom << endl;
}
void test01() {

	Father f;
	f.visit();

}
int main() {
	test01();
	system("pause");
	return 0;


}

3、 成员函数做友元

其实成员函数做友元很简单,就是在另外一个类中将成员函数变为友元函数 即可

//成员函数做友元函数 和上面类做友元函数区别不是很大
class Building;//在前面声明一下
class Father {
	
public:
	Father();
	//创建两个成员函数,分别去访问另一个的私有属性
	 void visit();
	 void visit1();
private:
	Building  *building;
};

class Building {
	friend void Father::visit();
public:
	Building();

public:
	string m_sittingRoom;
private:
	string m_BedRoom;

};

//在类外写成员函数,前面加上成员函数的类名称和作用域
Building::Building() {
	
	//给属性赋初值
	this->m_sittingRoom = "客厅";
	this->m_BedRoom = "卧室";

}
//在类外写成员函数,前面加上成员函数的类名称和作用域
Father::Father() {
	//利用指针创建一个建筑物对象

	building = new Building;
}
//在类外写成员函数,前面加上成员函数的类名称和作用域
void Father::visit() {

	cout << "家人访问" << building->m_sittingRoom << endl;

	cout << "家人访问" << building->m_BedRoom << endl;
}
//对于成员函数 Father类中的成员函数void visit1();就访问不了Building类中的私有成员。
void Father::visit1() {

	cout << "家人访问" << building->m_sittingRoom << endl;

	//cout << "家人访问" << building->m_BedRoom << endl;
}
void test01() {

	Father f;
	f.visit();
	f.visit1();

}

int main() {
	test01();
	system("pause");
	return 0;


}

注意友元函数在使用的过程中
1、类与类之间的友元关系不能被继承。(友元不属于类的成员函数)
2、友元函数破坏了封装的机制,最好谨慎使用。
3、友元函数就是让一个函数或者类 访问另一个类中私有成员,但是对于多个类之间的访问,友元函数不具有传递性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值