📅  最后修改于: 2023-12-03 15:08:52.171000             🧑  作者: Mango
在C++中,类的访问控制是通过三种权限来进行管理的:公有(public)、私有(private)和保护(protected)。其中,公有成员被类的任何部分和外界访问;私有成员只能被类的成员函数和友元函数访问;保护成员可以被派生类的成员函数和友元函数访问。
但是,有时候我们需要在类的外部访问它的私有或受保护的方法。这种情况下,可以通过以下方法来实现。
友元函数是在类中声明的独立函数,它可以访问类的私有成员。如果想让一个函数拥有访问一个类的私有成员的权限,可以将这个函数声明为该类的友元函数。在声明友元函数的时候,需要使用friend
关键字。
以下是一个例子:
#include<iostream>
using namespace std;
class MyClass {
private:
int x;
void printX() {
cout << "x = " << x << endl;
}
public:
MyClass(int _x) : x(_x) {}
friend void outsidePrintX(MyClass myObj); // 声明友元函数
};
void outsidePrintX(MyClass myObj) {
myObj.printX(); // 在友元函数中访问私有成员函数
}
int main() {
MyClass obj(10);
outsidePrintX(obj); // 调用友元函数
return 0;
}
友元函数outsidePrintX()
被声明为MyClass
的友元函数,可以在函数定义中访问类的私有函数printX()
,然后通过调用该函数在类对象obj
中输出私有成员变量x
的值。
如果需要一个类访问另一个类的私有或受保护成员,可以将其声明为后者的友元类。在声明友元类的时候同样需要使用friend
关键字。
以下是一个例子:
#include<iostream>
using namespace std;
class MyClass {
private:
int x;
void printX() {
cout << "x = " << x << endl;
}
public:
MyClass(int _x) : x(_x) {}
friend class MyFriendClass; // 声明友元类
};
class MyFriendClass {
public:
static void outsidePrintX(MyClass myObj) {
myObj.printX(); // 在友元类的静态函数中访问私有成员函数
}
};
int main() {
MyClass obj(10);
MyFriendClass::outsidePrintX(obj); // 调用友元类的静态函数
return 0;
}
类MyFriendClass
被声明为MyClass
的友元类,因此它可以访问MyClass
的私有成员函数printX()
。在友元类中定义一个静态函数outsidePrintX()
,该函数可以访问MyClass
的私有成员函数,并通过调用该函数在类对象obj
中输出私有成员变量x
的值。
值得注意的是,尽管友元函数和友元类都可以访问私有和受保护数据成员和成员函数,但它们也可能会破坏封装性和数据的隐私性,应该谨慎使用。