C++ 友元

偷偷拿来记录一下萌新的cs路——day 28 

友元

#include<iostream>
using namespace std;

class Building {
	friend void goodFriend(Building* building);  // goodFriend全局函数是Building类的好朋友,可访问类中私有内容
public:
	Building() {
		m_SittingRoom = "客厅";
		m_BedRoom = "卧室";
	}
	string m_SittingRoom;
private:
	string m_BedRoom;
};

// 全局函数
void goodFriend(Building *building) {
	cout << "好朋友全局函数正在访问:" << building->m_SittingRoom << endl;
	cout << "好朋友全局函数正在访问:" << building->m_BedRoom << endl;
}

void test01() {
	Building b;
	goodFriend(&b);
}

int main() {
	test01();
	return 0;
}

运行结果:

类作友元

#include<iostream>
using namespace std;

class Building;  // 类的声明

class GoodFriend {
public:
	GoodFriend();
	void visit();  // 参观函数 访问Building中属性

	Building* b;
};

class Building {
	friend class GoodFriend;
public:
	Building();
	string m_SittingRoom;
private:
	string m_BedRoom;
};

// 类外写成员函数
Building::Building() {
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}

GoodFriend::GoodFriend() {
	// 创造建筑物对象
	b = new Building;
}

void GoodFriend::visit() {
	cout << "好朋友类正在访问:" << b->m_SittingRoom << endl;
	cout << "好朋友类正在访问:" << b->m_BedRoom << endl;
}

void test01() {
	GoodFriend g;
	g.visit();
}

int main() {
	test01();
	return 0;
}

运行结果:

成员函数作友元

#include<iostream>
#include<string>
using namespace std;


class Building;

class GoodFriend {
public:
	GoodFriend();
	void visit();  // 使visit函数可访问Building中私有成员
	void visit2();  // visit2不可访问
	Building* b;
};

class Building {
	// GoodFriend类中的visit作为Building的friend可以访问私有成员
	friend void GoodFriend::visit();
	friend void GoodFriend::visit2();
public:
	Building();  // 构造函数声明
	string m_SittingRoom;
private:
	string m_BedRoom;
};

// 类外实现成员函数
Building::Building() {
	m_SittingRoom = "客厅";
	m_BedRoom = "卧室";
}

GoodFriend::GoodFriend() {
	b = new Building;
}

void GoodFriend::visit() {
	cout << "visit函数正在访问:" << b->m_SittingRoom << endl;
	cout << "visit函数正在访问:" << b->m_BedRoom << endl;
}

void GoodFriend::visit2() {
	cout << "visit2函数正在访问:" << b->m_SittingRoom << endl;
	//cout << "visit2函数正在访问:" << b->m_BedRoom << endl;
}

void test01() {
	GoodFriend g;
	g.visit();
	g.visit2();
}

int main() {
	test01();
	return 0;
}

其中 GoodFriend类不能在 Building类后定义,否则会因无法识别 friend void GoodFriend::visit/visit2(); 而报错。

运行结果:

以后学了更多知识还会回来更新的!有误之处恳请大佬指正,提前感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值