友元关系

在编程中我们通过public,protected和private这些访问级别可以让程序员控制谁有权使用某个类里的某个方法和属性。这个强大的方案可以把代码的实现细节隐藏起来,不让没有相应权限的其他代码访问到。

可是在某些场合,一个完全无关的类由于某些特殊原因需要访问到某个protected成员,甚至某个private成员,那该怎么办呢?

有些朋友可能会说,那就把所有的东西都声明为public吧。这样固然可以,但这样不就把原来我们想办法要保护的方法或者属性又暴露了吗?

由于这种特殊且尴尬的矛盾存在,C++的发明者为此准备了一个解决方案:友元关系。

友元关系是类之间的一种特殊关系,这种关系不仅允许友元类访问对方的public方法和属性,还允许友元访问对方的protected和private方法和属性。

声明一个友元关系的语法很简单,只要在类声明里的某个地方加上一条friend class ** 就行了

注:这条语句可以放在任何地方,放在public,protected,private段落里都可以。

注意:这是我刚开是理解错误的地方,这个friend是写在刚开始的那个写,而不是在后面的那个写

例子:

#include <iostream>
#include <string>

class Lovers
{
public:
	Lovers(std::string theName);
	void kiss(Lovers *lover);
	void ask(Lovers *lover, std::string something);

protected:
	std::string name;

	friend class Others;
};

class Boyfriend : public Lovers
{
public:
	Boyfriend(std::string theName);
};

class Girlfriend : public Lovers
{
public:
	Girlfriend(std::string Lovers);
};

class Others
{
public:
	Others(std::string theName);
	void kiss(Lovers *lover);

protected:
	std::string name;
};

Lovers::Lovers(std::string theName)
{
	name = theName;
}

void Lovers::kiss(Lovers *lover)
{
	std::cout << name << "亲亲我们家的" << lover->name << std::endl;
}

void Lovers::ask(Lovers *lover, std::string something)
{
	std::cout << "宝贝儿" << lover->name << "帮我" << something << std::endl;
}

Boyfriend::Boyfriend(std::string theName) : Lovers(theName)
{

}

Girlfriend::Girlfriend(std::string theName) : Lovers(theName)
{

}

Others::Others(std::string theName)
{
	name = theName;
}

void Others::kiss(Lovers *lover)
{
	std::cout << name << "亲了一下" << lover->name << std::endl;
}
int main()
{
	Boyfriend boyfriend("A君");
	Girlfriend girlfriend("B妞");

	Others others("路人甲");

	girlfriend.kiss(&boyfriend);
	girlfriend.ask(&boyfriend, "洗衣服啦");

	std::cout << "\n当当当当!传说中的路人甲出场了" << std::endl;
	others.kiss(&girlfriend);

	return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值