C++ 友元函数
C++ 友元函数
类的友元函数定义在类作用域之外,但它有权访问类的所有私有和受保护成员。即使友元函数的原型出现在类定义中,友元函数也不是成员函数。
友元可以是函数、函数模板、成员函数,也可以是类或类模板,在这种情况下,整个类及其所有成员都是友元。
声明友元函数
要将函数声明为类的友元,请在类定义中的函数原型前加上关键字 friend,如下所示
语法
class Box { double width; public: double length; friend void printWidth( Box box ); void setWidth( double wid ); };
要将 ClassTwo 类的所有成员函数声明为 ClassOne 类的友元函数,请在 ClassOne 类的定义中添加以下声明 -
friend class ClassTwo;
友元函数示例
以下是 C++ 中 Friend 函数的代码:
#include <iostream> using namespace std; class Box { double width; public: friend void printWidth( Box box ); void setWidth( double wid ); }; // 成员函数定义 void Box::setWidth( double wid ) { width = wid; } // 注意:printWidth() 不是任何类的成员函数。 void printWidth( Box box ) { /* 由于 printWidth() 是 Box 的友元,因此它可以 直接访问此类的任何成员 */ cout << "Width of box : " << box.width <<endl; } // Main function for the program int main() { Box box; // 不使用成员函数设置框宽度 box.setWidth(10.0); // 使用友元函数打印宽度。 printWidth( box ); return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Width of box : 10
访问私有成员和受保护成员
类的私有成员和受保护成员在类外部无法访问。但是,如果您想访问它们,可以使用 friend 函数。friend 函数可以直接访问类的私有成员和受保护成员。
示例
以下示例演示了如何使用 friend 函数访问类的私有成员和受保护成员:
#include <iostream> using namespace std; class ClassName { private: int privateData; // 私有成员 protected: int protectedData; // 受保护成员 public: ClassName() : privateData(0), protectedData(0) {} // 声明一个友元函数 friend void friendFunction(ClassName& obj); }; // 友元函数定义 void friendFunction(ClassName& obj) { obj.privateData = 42; // 访问私有成员 obj.protectedData = 24; // 访问受保护成员 cout << "Private Data: " << obj.privateData << endl; cout << "Protected Data: " << obj.protectedData << endl; } int main() { ClassName obj; friendFunction(obj); // 调用好友函数 return 0; }
当编译并执行上述代码时,它会产生以下结果 -
Private Data: 42 Protected Data: 24
友元函数 vs 成员函数
在 C++ 中,友元函数和成员函数都用于访问和操作类的数据,但它们在作用域和用法上仍然存在显著差异。
友元函数
友元函数是使用"friend"关键字在类内部声明的非成员函数,它对类的私有成员和受保护成员具有特殊访问权限。由于它不是成员函数,因此不绑定到特定对象,不能基于对象重载,不能使用 this 指针,也不能被派生类继承。它们在类外部定义,但在类内部声明。
成员函数
而成员函数在类内部定义,并使用 this 指针进行操作。它可以访问类的所有成员(私有、受保护和公共),并且由于它与类对象绑定,因此可以被派生类重载和继承。
友元类
在 C++ 中,友元类是指可以访问另一个类的私有和受保护成员的类。当一个类将另一个类声明为友元类时,第二个类(友元类)可以直接访问第一个类的私有和受保护成员。
这个概念类似于友元函数,但这里的朋友是整个类,而不是特定的函数。
语法
以下是 C++ 中友元类的语法:
class ClassB; // ClassB 的前向声明 class ClassA { private: int dataA; public: // 将 ClassB 声明为 ClassA 的朋友 friend class ClassB; };示例
以下示例演示了 C++ 中朋友类的示例:
#include <iostream> using namespace std; class ClassB; // ClassB 的前向声明 class ClassA { private: int dataA; public: ClassA() : dataA(42) {} // 使用值初始化数 据 // 将 Class 声明为 ClassA 的朋友 friend class ClassB; }; class ClassB { public: void showDataFromA(const ClassA& objA) { // 访问 ClassA 的私有成员 cout << "Data from ClassA: " << objA.dataA << endl; } }; int main() { ClassA objA; ClassB objB; // 使用 ClassB 访问 ClassA 的私有数据 objB.showDataFromA(objA); return 0; }