亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> C语言

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语言

  1. C# 类与对象:面向对象编程的基石
  2. 掌握 C# 抽象类与抽象方法:实战指南
  3. 理解 C# 分部类与分部方法
  4. 掌握 C# sealed 类与方法:用法、示例与代码安全性能提升
  5. C++类与对象:面向对象编程实战指南
  6. C++ Struct 与 Class 核心差异、语法及最佳实践
  7. C++存储类别全解析:auto/register/static/extern/mutable作用域与生命周期
  8. C++日期时间完全指南:ctime库、tm结构体与格式化输出
  9. C++重载机制深度解析:函数重载与运算符重载全攻略
  10. C++多态实战指南:虚函数、动态绑定与纯虚函数
  11. C++数据抽象实战:接口与实现分离的设计艺术
  12. 精通 Java:理解对象、类与核心 OOP 概念