[整理]C++友元类友元函数

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [整理]C++友元类友元函数

什么是C++的友元类、友元函数呢?下面通过一个例子进行讲解。

假设一个公司有工程师Engineer,项目经理PM,技术总监CTO,他们的职责关系是Engineer受PM管理,PM受CTO管理。

现在定义一个PM类,它拥有一个成员变量m_report,表示周报内容。

class PM
{
private:
	WeeklyReport m_report;
};

从公司流程规范上,PM的周报只能被CTO阅读,而普通的Engineer是无权阅读的。再次,已经将m_report用private修饰,保证了所有其他人都无法阅读PM的周报。那么问题来了,Engineer无权阅读,而CTO有权阅读,如何在C++里表示这种关系呢?

那么,便引入了C++的友元类概念了。

我们将类CTO声明为PM的“朋友”,则可授权CTO类访问PM类的所有成员。这个语法通过friend声明语句完成。

class PM
{
	friend class CTO;
private:
	WeeklyReport m_report;
};

class CTO
{
public:
	void Read(PM &pm) {
		//can access pm.m_report
	}
	CTO();
	~CTO();
	
};

通过friend关键字,可以将一个全局函数func或者一个类B,声明为类A的朋友。类A的朋友可以自由的访问类A的所有成员,不受访问修饰符的限制。

class A
{
	friend void func(A* p);
	friend class B;
	//constructor
	A() {

	}
};

(1)friend声明语句的位置:放在类体的大括号里,但位置是自由的,可以靠上,也可以靠下。习惯上把friend声明语句放在大括号内的最前面。

(2)朋友拥有的权利:可以无限制的访问类A的所有成员,不受private/protected的限制。

(3)类B被声明为A的朋友,则B可以访问A的所有成员。反之不成立:A不是B的朋友,A无法访问B的所有成员。这意味着,朋友关系也是“单向”的。

把一个全局函数声明为朋友时,需要列出其函数原型,前面加一个关键字friend;

把一个类声明为朋友时,需要在类前面加上friend class关键字。

原创文章,转载请注明: 转载自勤奋的小青蛙
本文链接地址: [整理]C++友元类友元函数

文章的脚注信息由WordPress的wp-posturl插件自动生成



|2|left
打赏

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: