我把你当朋友,你就能访问我的一切(是真的一切);但你不将我当作朋友,我就不能访问你的一切。
定义与使用
在类A中,用friend关键字可以将一个全局函数声明为该类的“朋友”,也可以将另一个类声明为该类的“朋友”。
(1)friend声明语句:位置自由,一般放在类体大括号的最前头。
(2)朋友的权利:可以无限地访问该类的所有成员。不受protected/private的限制
class Object
{
//将全局函数Print声明为“朋友”
friend void Print(Object* p);
//将类Something声明为“朋友”
friend class Something;
};
来看一个简单的例子:
#include "pch.h"
#include <iostream>
#include "stdio.h"
class Object
{
friend void Print(Object* p);
friend class Something;
public:
Object(int v): value(v)
{}
private:
int value;
};
void Print(Object* p)
{
printf("value:%d \n", p->value);
}
class Something
{
public:
void Test(Object* p)
{
printf("value:%d \n", p->value);
}
};
int main()
{
Object a(5);
Print(&a);
Something s;
s.Test(&a);
return 0;
}
注意:朋友关系是单向的,Something类可以自由访问Object类,但反过来不行。
负面作用:friend是不常用的语句,它破坏了访问修饰符的作用,对类的封装构成威胁。
正面作用:在封装一个模块时,模块中的多个类,那么他们之间可以互为朋友以便操作。也就是说模块内部都是朋友,可以互相使用,但外部的人就得受访问修饰符的限制。(一般只有这种情况才会用到friend)
友元函数和类的成员函数的区别
(1)成员函数有this指针,而友元函数没有this指针。
(2)友元函数是不能被继承的,就像父亲的朋友未必是儿子的朋友。