Loading

[CPP] Friend关键字的作用

Friend Class

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

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

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

Friend function

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

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

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

一些要点

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

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

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

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/

posted @ 2020-06-18 14:56  芒果和小猫  阅读(372)  评论(0编辑  收藏  举报