什么是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插件自动生成
微信扫一扫,打赏作者吧~![[整理][转载]win下网卡抓包发包库Npcap使用](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2023/08/demo_1-1024x711.jpg&w=280&h=210&zc=1)
![[转载]基础数据char,int,double,string是线程安全的吗?](http://www.jyguagua.com/wp-content/themes/begin/img/random/15.jpg)
![[整理]用c++编写的RDTSC性能计时器](http://www.jyguagua.com/wp-content/themes/begin/timthumb.php?src=http://www.jyguagua.com/wp-content/uploads/2020/12/rdtsc-assembly-example.jpg&w=280&h=210&zc=1)
![[整理]strcmp汇编写法](http://www.jyguagua.com/wp-content/themes/begin/img/random/7.jpg)