C++ 友元类
友元类的基本概念
在C++面向对象编程中,封装是一个核心概念,它通常通过访问控制符(public、protected、private)来实现。然而,有时我们需要让特定的类或函数访问另一个类的私有成员,这就是友元(Friend)机制存在的意义。
友元类是指被授予访问另一个类的非公有(private和protected)成员的权限的类。简单来说,如果类A将类B声明为其友元,那么类B的成员函数就可以访问类A的所有成员(包括私有成员)。
备注
友元关系不是相互的:如果类B是类A的友元,并不意味着类A自动成为类B的友元。
警告
友元关系也不能被继承:如果类C继承自类B,而类B是类A的友元,类C并不自动成为类A的友元。
友元类的语法
在C++中,要将一个类声明为另一个类的友元,需要在被访问类中使用friend
关键字声明。语法如下:
class ClassA {
private:
int privateData;
public:
ClassA() : privateData(10) {}
// 声明ClassB为友元类
friend class ClassB;
};
class ClassB {
public:
void accessPrivateData(ClassA& a) {
// 由于ClassB是ClassA的友元,可以访问ClassA的私有成员
cout << "ClassA's privateData: " << a.privateData << endl;
}
};
友元类的工作原理
让我们通过一个完整的示例来理解友元类是如何工作的:
#include <iostream>
using namespace std;
class BankAccount {
private:
double balance;
string accountNumber;
public:
BankAccount(string accNum, double initialBalance) :
accountNumber(accNum), balance(initialBalance) {}
// 声明AuditSystem为友元类
friend class AuditSystem;
void deposit(double amount) {
balance += amount;
cout << "Deposited: $" << amount << endl;
}
void displayPublicInfo() {
cout << "Account: " << accountNumber << endl;
cout << "Current Balance: $" << balance << endl;
}
};
class AuditSystem {
public:
void auditAccount(BankAccount& account) {
// 作为友元类,可以访问BankAccount的私有成员
cout << "\n--- AUDIT REPORT ---" << endl;
cout << "Account Number: " << account.accountNumber << endl;
cout << "Balance: $" << account.balance << endl;
// 执行审计逻辑
if (account.balance < 0) {
cout << "WARNING: Negative Balance Detected!" << endl;
}
cout << "-------------------\n" << endl;
}
};
int main() {
BankAccount myAccount("AC123456789", 1000.0);
myAccount.displayPublicInfo();
myAccount.deposit(500.0);
myAccount.displayPublicInfo();
// 进行账户审计
AuditSystem auditor;
auditor.auditAccount(myAccount);
return 0;
}
输出结果:
Account: AC123456789
Current Balance: $1000
Deposited: $500
Account: AC123456789
Current Balance: $1500
--- AUDIT REPORT ---
Account Number: AC123456789
Balance: $1500
-------------------
在这个例子中,AuditSystem
类被声明为BankAccount
类的友元,因此它可以访问BankAccount
对象的私有成员(如balance
和accountNumber
)。这种设计允许审计系统查看账户的详细信息,而不需要通过公共接口来访问。