友元学习
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/362d5ccfa9ba4ec8b49259caca9a4615.png)
友元函数和友元类的基本情况
友元提供了不同类的成员函数之间、类的成员函数和一般函数之间进行数据共享的机制。
通过友元,一个不同函数或者另一个类中的成员函数可以访问类中的私有成员和保护成员。友元的正确使用能提高程序的运行效率,但同时也破坏了类的封装性和数据的隐藏性,导致程序可维护性变差。
友元函数
有元函数是定义在类外的普通函数,不属于任何类,可以访问其他类的私有成员。但是需要在类的定义中声明所有可以访问它的友元函数。
友元函数的例子:
#include <iostream>
using namespace std;
class A
{
public:
friend void set_show(int x, A &a); //该函数是友元函数的声明
private:
int data;
};
void set_show(int x, A &a) //友元函数定义,为了访问类A中的成员
{
a.data = x;
cout << a.data << endl;
}
int main(void)
{
class A a;
set_show(1, a);
return 0;
}
友元类
友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包括私有成员和保护成员)。 但是另一个类里面也要相应的进行声明
例子:
#include <iostream>
using namespace std;
class A
{
public:
friend class C; //这是友元类的声明
private:
int data;
};
class C //友元类定义,为了访问类A中的成员
{
public:
void set_show(int x, A &a) { a.data = x; cout<<a.data<<endl;}
};
int main(void)
{
class A a;
class C c;
c.set_show(1, a);
return 0;
}
注意:
(1) 友元类的友元关系不能被继承。
(2) 友元关系是单向的,不具有交换性。若类B是类A的友元,类A不一定是类B的友元,要看在类中是否有相应的声明。
(3) 友元关系不具有传递性。若类B是类A的友元,类C是B的友元,类C不一定是类A的友元,同样要看
类中是否有相应的申明
使用场景
友元的使用场景包括但不限于以下情况:
- 当两个或多个类需要共享私有数据时,可以使用类友元来实现数据的直接访问,而无需通过公有接口。
- 当某个类需要提供特定函数或操作给其他类使用,但这些函数需要访问类的私有成员时,可以使用函数友元。
- 在重载运算符或实现某些特定功能时,友元可以提供对类私有成员的直接访问。
需要注意的是,友元机制破坏了封装性,因为其他类或函数可以直接访问被授予友元权限的类的私有成员。因此,应谨慎使用友元,只在必要的情况下使用,并且仅将其授予最少的访问权限。