当前位置: 首页 > news >正文

cpp-友元

理解 C++ 中的友元(Friend)

在 C++ 语言中,封装(Encapsulation) 是面向对象编程的重要特性之一。它允许类将数据隐藏在私有(private)或受保护(protected)成员中,防止外部直接访问。然而,在某些情况下,我们希望某些函数或类能够访问这些私有成员,而不破坏封装性。这时,我们就需要友元(Friend)


1. 什么是友元?

友元(friend) 是 C++ 提供的一种机制,它允许一个函数或另一个类访问某个类的私有和受保护成员。友元有三种类型:

  1. 友元函数(Friend Function)

  2. 友元类(Friend Class)

  3. 友元成员函数(Friend Member Function)


2. 友元函数

友元函数是一个非成员函数,但它可以访问类的私有和受保护成员。要声明友元函数,需要在类内部使用 friend 关键字。

示例:友元函数

#include <iostream>
using namespace std;

class Box {
private:
    double width;

public:
    Box(double w) : width(w) {}
    
    // 声明友元函数
    friend void printWidth(const Box &b);
};

// 定义友元函数
void printWidth(const Box &b) {
    cout << "Width: " << b.width << endl;
}

int main() {
    Box b(10.5);
    printWidth(b);
    return 0;
}

在上面的示例中,printWidth 不是 Box 类的成员函数,但由于它被声明为 friend,它可以访问 Box 的私有成员 width


3. 友元类

友元类允许一个类访问另一个类的私有和受保护成员。

示例:友元类

#include <iostream>
using namespace std;

class Engine {
private:
    int horsepower;

public:
    Engine(int hp) : horsepower(hp) {}
    
    // 声明 Car 为友元类
    friend class Car;
};

class Car {
public:
    void showEnginePower(const Engine &e) {
        cout << "Engine horsepower: " << e.horsepower << endl;
    }
};

int main() {
    Engine e(150);
    Car c;
    c.showEnginePower(e);
    return 0;
}

在这个例子中,CarEngine 的友元类,因此它可以访问 Engine 类的私有成员 horsepower


4. 友元成员函数

我们还可以只将另一个类的某个成员函数设为友元,而不是整个类。

示例:友元成员函数

#include <iostream>
using namespace std;

class Engine;

class Car {
public:
    void showEnginePower(const Engine &e);
};

class Engine {
private:
    int horsepower;

public:
    Engine(int hp) : horsepower(hp) {}
    
    // 声明 Car::showEnginePower 为友元
    friend void Car::showEnginePower(const Engine &e);
};

void Car::showEnginePower(const Engine &e) {
    cout << "Engine horsepower: " << e.horsepower << endl;
}

int main() {
    Engine e(200);
    Car c;
    c.showEnginePower(e);
    return 0;
}

这里 Car::showEnginePowerEngine 的友元成员函数,因此它可以访问 Engine 的私有成员。


5. 友元的应用场景

友元在以下情况中非常有用:

  1. 运算符重载(如 operator<<operator>> 需要访问类的私有成员)。

  2. 类之间的紧密协作(如 Car 需要访问 Engine 的私有数据)。

  3. 全局函数需要访问私有数据(如调试函数、日志记录等)。


6. 友元的优缺点

优点:

  • 允许外部函数/类访问私有数据,增强类之间的协作能力。

  • 使操作符重载更加直观。

缺点:

  • 破坏了封装性,降低了数据的安全性。

  • 可能导致代码耦合度增加。


7. 总结

  1. 友元函数 可以访问类的私有/受保护成员,但不是类的成员。

  2. 友元类 允许另一个类访问本类的私有成员。

  3. 友元成员函数 允许一个类的特定成员函数访问本类的私有成员。

  4. 友元应该谨慎使用,避免破坏封装性。

相关文章:

  • 马科维茨均值—方差理论推导过程
  • 分布式系统设计陷阱,白话CAP理论
  • CVE-2020-0796:永恒之黑实战学习
  • Redis + 布隆过滤器解决缓存穿透问题
  • 微服务 - 中级篇
  • WebLogic中间件常见漏洞
  • sqrt函数(豆包)
  • 【leetcode100】搜索二维矩阵
  • 整合vue+Element UI 开发管理系统
  • 浅谈布隆过滤器(Bloom Filter)
  • kotlin知识体系(四) : inline、noinline、crossinline 关键字对应编译后的代码是怎样的 ?
  • 西门子G120扭矩控制
  • 系统设计类问题回答模板
  • 平芯微PW5012应用电路
  • emWin自定义键盘布局
  • 实验一、Linux环境下实现进度条小程序:深入解析核心实现与关键技术细节
  • 英伟达有哪些支持AI绘画的 工程
  • VMWare虚拟机磁盘扩容
  • Dify 0.15.3 输入变量无法被重新赋值问题-解决方法
  • 用selenium+ChromeDriver豆瓣电影 肖申克的救赎 短评爬取(pycharm 爬虫)
  • 日中友好议员联盟代表团访问中国人民对外友好协会
  • 人民时评:投资于人,促高质量充分就业
  • 三杀皇马剑指四冠,硬扛到底的巴萨,赢球又赢人
  • 持续更新丨伊朗内政部长:港口爆炸已致14人死亡
  • 咖啡与乳腺健康之间,究竟有着怎样的复杂关系?
  • 海上生明月,九天揽星河,2025年“中国航天日”主场活动在上海启动