1.87、解释什么是友元类(friend class)或友元函数(friend function)
友元类(friend class)和友元函数(friend function)是C++中用于突破类的访问控制限制的一种机制,允许非成员函数或其他类访问该类的私有(private)和保护(protected)成员。
友元函数(friend function)
- • 定义:友元函数不是类的成员函数,但被类声明为友元后,拥有访问该类所有成员(包括private和protected)的权限。
- • 声明方式:在类内部使用
friend
关键字声明该函数。 - • 用途:常用于实现需要访问类内部状态但不适合成为成员函数的操作,比如重载某些运算符、辅助函数等。
- • 特点:
- • 不是类的成员函数,没有
this
指针。 - • 可以访问类的所有成员。
- • 可以是普通函数、函数模板、类的成员函数等。
- • 需要在类定义中声明,但函数体一般定义在类外。
- • 不是类的成员函数,没有
- • 示例:
class A {
private:
int x;
public:
A(int val) : x(val) {}
friend void showX(const A& a); // 友元函数声明
};
void showX(const A& a) {
std::cout << "x = " << a.x << std::endl; // 访问私有成员
}
友元类(friend class)
- • 定义:当一个类被另一个类声明为友元类时,友元类的所有成员函数都可以访问该类的私有和保护成员。
- • 声明方式:在类内部使用
friend class 类名;
声明。 - • 用途:适用于两个类之间关系非常紧密,需要互相访问内部实现细节的场景,比如设计辅助类、管理类等。
- • 特点:
- • 友元关系是单向的,被友元类可以访问声明它为友元的类的私有成员,但反之不成立。
- • 友元关系不具有继承性和传递性。
- • 示例:
class B; // 前向声明
class A {
private:
int data;
public:
A() : data(42) {}
friend class B; // 声明B为友元类
};
class B {
public:
void showData(const A& a) {
std::cout << "A::data = " << a.data << std::endl; // 访问A的私有成员
}
};
面试考察重点
- • 理解友元不是成员,但享有访问权限,打破封装的“例外”机制。
- • 友元关系的单向性,即友元类/函数可以访问被友元类的私有成员,但反过来不成立。
- • 友元关系的非继承性和非传递性,即友元不会自动传递给派生类或其他类。
- • 合理使用友元的设计原则,避免过度破坏封装,保持代码模块性和维护性。
- • 区别友元函数和成员函数的访问权限和调用方式。
- • 熟悉友元函数定义可以放在类内或类外,但友元函数本质是非成员函数。
本文首发于【讳疾忌医-note】公众号,未经授权,不得转载。
(加入我的知识星球,免费获取账号,解锁所有文章。)
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/1883
文章版权归作者所有,未经允许请勿转载。
THE END