简述C++友元函数和友元类 ?
参考答案:
C++中的友元函数和友元类是一种特殊的访问控制机制,允许特定的非成员函数或非成员类访问类的私有和保护成员。
友元函数(Friend Function)
友元函数是一种特殊的非成员函数,它可以访问一个类的私有成员和保护成员。要在类中声明一个友元函数,需要在类定义中使用friend
关键字,并指定函数的原型。例如:
class MyClass {
private:
int myPrivateVar;
public:
friend void friendFunction(MyClass& obj); // 声明友元函数
};
void friendFunction(MyClass& obj) {
obj.myPrivateVar = 10; // 访问私有成员
}
在上面的例子中,friendFunction
是一个友元函数,它可以访问MyClass
的私有成员myPrivateVar
。
友元类(Friend Class)
友元类是一种特殊的非成员类,它可以访问另一个类的私有成员和保护成员。要在类中声明一个友元类,需要在类定义中使用friend
关键字,并指定类的名称。例如:
class MyClass {
private:
int myPrivateVar;
public:
friend class FriendClass; // 声明友元类
};
class FriendClass {
public:
void setMyPrivateVar(MyClass& obj, int value) {
obj.myPrivateVar = value; // 访问MyClass的私有成员
}
};
在上面的例子中,FriendClass
是一个友元类,它可以访问MyClass
的私有成员myPrivateVar
。
注意事项
- 友元关系不具有传递性。如果类A是类B的友元,类B是类C的友元,这并不意味着类A是类C的友元。
- 友元关系不具有交换性。如果类A是类B的友元,并不意味着类B是类A的友元,除非在类B中也声明类A为友元。
- 友元函数和友元类可以访问类的私有成员和保护成员,但它们不是类的成员函数,因此不能访问类的非公有成员(如私有继承的成员)。
- 使用友元函数和友元类时要谨慎,因为它们可能破坏封装性。在确实需要访问类的私有成员时,才考虑使用友元。