C++ 友元函数与友元类:突破访问控制的利器
C++ 友元函数与友元类:突破访问控制的利器
本教程通过清晰示例演示如何声明和使用 C++ 友元函数与友元类,实现跨类边界的受控访问。
数据隐藏是面向对象编程基石,防止外部代码直接访问类的私有成员。受保护成员仅对派生类可见,外部同样不可见。
考虑以下示例:
class MyClass {
private:
int member1;
};
int main() {
MyClass obj;
// 错误!无法从外部访问私有成员
obj.member1 = 5;
}
尽管有此限制,C++ 提供友元函数机制,可绕过常规访问控制,操作类的私有/受保护数据。
友元类是类似概念,允许整个类作为友元。两者用得当既增强封装又不失灵活性。
C++ 友元函数
友元函数可读写类的私有和受保护成员。在类定义内用 friend 关键字声明:
class ClassName {
// ...
friend ReturnType FunctionName(Arguments);
// ...
}
示例 1:基础友元函数
// 友元函数工作原理演示
#include <iostream>
using namespace std;
class Distance {
private:
int meter;
// 友元函数声明
friend int addFive(Distance);
public:
Distance() : meter(0) {}
};
// 友元函数定义
int addFive(Distance d) {
// 从友元函数访问私有成员
d.meter += 5;
return d.meter;
}
int main() {
Distance D;
cout << "Distance: " << addFive(D);
return 0;
}
输出
Distance: 5
addFive() 演示了友元函数可自由访问私有字段 meter。虽简单,但阐释了核心思想。
示例 2:操作两个类的私有成员
// 使用友元函数访问两个不同类的私有成员求和
#include <iostream>
using namespace std;
// 前向声明
class ClassB;
class ClassA {
public:
ClassA() : numA(12) {}
private:
int numA;
// 友元函数声明
friend int add(ClassA, ClassB);
};
class ClassB {
public:
ClassB() : numB(1) {}
private:
int numB;
// 友元函数声明
friend int add(ClassA, ClassB);
};
// 访问两个类的私有成员
int add(ClassA objectA, ClassB objectB) {
return (objectA.numA + objectB.numB);
}
int main() {
ClassA objectA;
ClassB objectB;
cout << "Sum: " << add(objectA, objectB);
return 0;
}
输出
Sum: 13
两个类均声明 add() 为友元,使该函数能访问两者私有数据,实现 numA 与 numB 求和。
注意:ClassA 中引用 ClassB 前需前向声明 class ClassB; 解决依赖。
C++ 友元类
将整个类声明为友元,其所有成员函数均可访问宿主类私有/受保护成员。语法:
class ClassB;
class ClassA {
// ClassB 是 ClassA 的友元类
friend class ClassB;
// ...
}
class ClassB {
// ...
}
ClassB 是 ClassA 的友元,故 ClassB 任意方法可自由读写 ClassA 私有数据。反之不成立,除非 ClassA 也声明 ClassB 为友元。
示例 3:友元类实战
// 友元类工作原理演示
#include <iostream>
using namespace std;
class ClassB; // 前向声明
class ClassA {
private:
int numA;
// 友元类声明
friend class ClassB;
public:
ClassA() : numA(12) {}
};
class ClassB {
private:
int numB;
public:
ClassB() : numB(1) {}
// 成员函数访问 ClassA 私有成员
int add() {
ClassA objectA;
return objectA.numA + numB;
}
};
int main() {
ClassB objectB;
cout << "Sum: " << objectB.add();
return 0;
}
输出
Sum: 13
ClassB 的 add() 方法访问 ClassA 私有成员 numA,因 ClassA 声明 ClassB 为友元。展示了友元类如何在保持封装前提下实现紧密协作。
综上,友元函数与友元类是 C++ 中跨类边界受控访问的有力工具。应谨慎使用,仅在设计受益时引入。
C语言
- C# 类与对象:面向对象编程的基石
- 掌握 C# 抽象类与抽象方法:实战指南
- 理解 C# 分部类与分部方法
- 掌握 C# sealed 类与方法:用法、示例与代码安全性能提升
- C++类与对象:面向对象编程实战指南
- C++ Struct 与 Class 核心差异、语法及最佳实践
- C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
- C++日期时间完全指南:ctime库、tm结构体与格式化输出
- C++重载机制深度解析:函数重载与运算符重载全攻略
- C++多态实战指南:虚函数、动态绑定与纯虚函数
- C++数据抽象实战:接口与实现分离的设计艺术
- 精通 Java:理解对象、类与核心 OOP 概念