什么是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关键字。
文章的脚注信息由WordPress的wp-posturl插件自动生成