1.定义
友元(Friend)是C++中一种特殊的访问控制机制,它允许一个类或函数访问另一个类的私有成员。友元在一些特殊情况下非常有用,但也应谨慎使用,因为它会打破封装性和数据隐藏原则。
当一个类或函数被声明为另一个类的友元时,它就能够绕过访问权限进行访问,即使这些成员在普通情况下对外是不可见的。友元的作用类似于家庭中的密友,可以借助其特殊身份获得其他成员私有信息的访问权。然而,友元并不是简单的双向关系,即A类是B类的友元,B类也是A类的友元,这种关系并不成立。友元有三种:友元函数、友元类、友元成员函数。
2.友元函数
class ClassA
{
public:
ClassA() { private_data = 5; };
private:
int private_data;
friend void FriendFunction(ClassA& class_a);
};
void FriendFunction(ClassA& class_a)
{
printf("%d\n", class_a.private_data);
}
int main(int argc, char* argv[])
{
ClassA class_a;
FriendFunction(class_a);
}
FriendFunction是ClassA的友元函数,因此FriendFunction可以直接访问ClassA的私有成员。
3.友元类
class ClassB;
class ClassA
{
public:
ClassA() { private_data = 5; };
private:
int private_data;
friend class ClassB;
};
class ClassB
{
public:
void GetClassAPrivate(ClassA& class_a)
{
printf("%d\n", class_a.private_data);
};
};
int main(int argc, char* argv[])
{
ClassA class_a;
ClassB class_b;
class_b.GetClassAPrivate(class_a);
}
主要语法:friend class FriendClass;
ClassB是ClassA的友元类,因此ClassB可以直接访问ClassA的私有成员
4.友元成员函数
class ClassA;
class ClassB
{
public:
void GetClassAPrivate(ClassA& class_a);
};
class ClassA
{
public:
ClassA() { private_data = 5; };
friend void ClassB::GetClassAPrivate(ClassA& class_a);
private:
int private_data;
};
void ClassB::GetClassAPrivate(ClassA& class_a)
{
printf("%d\n", class_a.private_data);
};
int main(int argc, char* argv[])
{
ClassA class_a;
ClassB class_b;
class_b.GetClassAPrivate(class_a);
}
注意:友元成员函数,应该这么理解ClassB的成员函数是ClassA的友元成员函数,意思是成员函数是ClassB不是ClassA的不要弄混了。由于需要把ClassB的某个成员函数定义为ClassA的友元成员函数,因此ClassB的类定义要放在ClassA之前,不然的话ClassA不知道ClassB有哪些成员函数。
5.使用场景
- 访问私有成员:主要作用是允许外部函数或类访问另一个类的私有成员,从而实现对类的细粒度控制。
- 操作符重载:当需要重载类的操作符(如<<、>>、+、-等)时,友元函数可以访问私有成员,实现合适的操作。
- 提高效率:在某些情况下,使用友元函数可以提高程序的执行效率,因为它可以直接访问类的私有成员,而不需要通过访问器函数(getter和setter)。
6.缺点
- 破坏封装性:友元函数可以突破类的封装性,使得类的私有成员可以被外部函数直接访问,可能会降低代码的安全性和可维护性。(友元也破环了类的隐藏与封装,所以必须慎用 (牺牲安全,提高效率))
- 难以维护:当程序变得复杂时,友元函数的使用可能会导致代码变得难以理解和维护。
注:友元不能 继承,交换,传递!
本文详细介绍了C++中的友元概念,包括友元函数、友元类和友元成员函数,以及它们如何访问私有成员、用于操作符重载和可能带来的封装性破坏与维护挑战。
5462

被折叠的 条评论
为什么被折叠?



