友元函数
定义
友元函数是在类中声明的非成员函数,它可以访问类的私有(private)和保护(protected)成员。友元函数虽然不是类的成员函数,但它被授予了访问类内部成员的特殊权限。
声明方式
在类的定义中,使用friend关键字来声明友元函数。
class MyClass {
private:int privateData;friend void friendFunction(MyClass& obj);
};void friendFunction(MyClass& obj) {obj.privateData = 10; // 可以访问私有成员
}
友元类
定义
友元类是指一个类可以访问另一个类的私有(private)和保护(protected)成员。如果类 A 是类 B 的友元类,那么类 A 的所有成员函数都可以访问类 B 的私有和保护成员。友元关系是单向的,不具有传递性。如果类A是类B的友元,类B不一定是类A的友元
声明方式
在类的定义中,使用friend关键字来声明友元类
class FriendClass {
private:int privateData;
public:FriendClass() : privateData(0) {}friend class OtherClass; // 声明 OtherClass 是 FriendClass 的友元类
};class OtherClass {
public:void accessPrivateData(FriendClass& obj) {obj.privateData = 42; // 可以直接访问 FriendClass 的私有成员}
};
作用
在C++中,友元(friend)是一种机制,允许某个类或函数访问其他类的私有成员。通过友元,可以授予其他类或函数对该类的私有成员的访问权限。友元关系在一些特定的情况下很有用,例如在类之间共享数据或实现特定的功能。
注意事项
封装性破坏风险
友元关系最大的风险在于它打破了类的封装性。类的封装原则是将数据隐藏起来,只通过成员函数来访问和修改数据。当使用友元时,外部的函数(友元函数)或者类(友元类)可以直接访问私有和保护成员,这可能会导致数据被意外地修改或者访问。
谨慎使用友元函数和友元类的继承关系
友元关系不会被继承。如果类 A 是类 B 的友元类,类 A 的子类不会自动成为类 B 的友元类。同样,类 B 的子类也不会自动继承和类 A 的友元关系。
避免过度使用
应该谨慎地使用友元。只有在确实有必要的情况下,如为了实现高效的操作符重载或者两个紧密相关的类之间需要特殊的访问权限时才使用。过度使用友元会使代码的结构变得松散,违背面向对象编程的封装原则。
参考文献C++友元函数和友元类-CSDN博客