1. 为什么需要友元、内部类和匿名对象?
在C++面向对象编程中,封装性是最基本的特性之一。我们通常通过public、protected和private来控制成员的访问权限。但有时候,这种严格的封装会带来一些不便。比如:
- 当两个类需要紧密协作时,频繁调用公有接口会导致性能损耗
- 某些全局函数需要访问类的私有成员来实现特定功能
- 临时对象只需要使用一次,为其命名反而增加了代码复杂度
这就是友元(friend)、内部类(inner class)和匿名对象(anonymous object)存在的意义。它们都是在特定场景下对封装性的合理突破或补充。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 友元机制详解
2.1 友元函数的工作原理
友元函数的声明方式很特殊:
cpp复制class MyClass {
private:
int secret;
public:
friend void friendFunction(MyClass& obj); // 友元声明
};
void friendFunction(MyClass& obj) {
obj.secret = 42; // 可以直接访问私有成员
}
关键点:
- 友元函数不是成员函数,但可以访问类的所有成员
- 友元关系是单向的,不具有传递性
- 友元声明的位置不影响其访问权限(可以放在public/private/protected任意区域)
注意:过度使用友元会破坏封装性。在实际项目中,应该优先考虑设计良好的公有接口,只在性能关键路径或特殊场景下使用友元。
2.2 友元类的实际应用
当一个类需要授予另一个类完全访问权限时,可以使用友元类:
cpp复制class Sensor {
private:
double rawData;
public:
friend class DataProcessor; // 声明友元类
};
class DataProcessor {
public:
void calibrate(Sensor& s) {
s.rawData *= 1.05; // 直接访问Sensor的私有成员
}
};
典型应用场景:
- 紧密耦合的类之间(如容
