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;
}

