Friend 关键字

1. Friend Class

Friend class可以访问别的class中的private和protected成员,只要在这个类中声明了friend。 通常可以使部分类访问其他类中的一些私有成员,例如在链表中,链表class作为节点class的friend,可以访问其私有成员。

class Node { 
private: 
	int key; 
	Node* next; 

	// 现在 class LinkedList 可以访问Node的私有成员了  
	friend class LinkedList; 
}; 

2. Friend function

像Friend class一样,friend function可以访问其他类中的private和protected成员,friend function可以是

  • 一个类的方法
  • 全局函数
class Node { 
private: 
	int key; 
	Node* next; 

    //只有LinkedList的search方法可以访问Node的内部成员
	friend int LinkedList::search(); 
	
}; 

3. 一些要点

  • 不要滥用friend,这样降低了class的封装性。
  • Friend不是相互的,A是B的Friend,但B不能自动成为A的Friend。
  • Friend关系不能继承。

4. Friend class的实例

#include <iostream> 
class A { 
private: 
	int a; 

public: 
	A() { a = 0; } 
	friend class B; // Friend Class 
}; 

class B { 
private: 
	int b; 

public: 
	void showA(A& x) 
	{ 
		//B 是A的Friend,所以可以访问私有成员
		std::cout << "A::a=" << x.a; 
	} 
}; 

int main() 
{ 
	A a; 
	B b; 
	b.showA(a); 
	return 0; 
} 

5. Friend method的实例

#include <iostream> 

class B; 

class A { 
public: 
	void showB(B&); 
}; 

class B { 
private: 
	int b; 

public: 
	B() { b = 0; } 
	friend void A::showB(B& x); // Friend function 
}; 

void A::showB(B& x) 
{ 
	//showB是 B的friend,所以可以访问私有成员
	std::cout << "B::b = " << x.b; 
} 

int main() 
{ 
	A a; 
	B x; 
	a.showB(x); 
	return 0; 
}

6. Friend global function的实例

#include <iostream> 

class A { 
	int a; 

public: 
	A() { a = 0; } 

	// global friend function 
	friend void showA(A&); 
}; 

void showA(A& x) 
{ 
	//showA是A的Friend function,所以可以访问私有成员。
	std::cout << "A::a=" << x.a; 
} 

int main() 
{ 
	A a; 
	showA(a); 
	return 0; 
}

参考
https://www.geeksforgeeks.org/friend-class-function-cpp/

参考:[CPP] Friend关键字的作用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落花逐流水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值