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

c++ 中的 friend 关键字

在 C++ 中,friend 关键字用于声明友元,它允许一个类或函数访问另一个类的私有(private)和受保护(protected)成员。友元机制打破了类的封装性,但提供了更高的灵活性,适用于特定场景。

Python 和 Java 中似乎没有见到类似的关键字。

  • 友元类:一个类可以声明另一个类为友元,使其能够访问自己的私有和受保护成员。
  • 友元函数:一个类可以声明某个函数(全局函数或另一个类的成员函数)为友元,授予其访问权限。
  • 友元关系是单向的,且不可继承。

友元函数例子:

#include <iostream>

using namespace std;

class Box {
private:
    double width;

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

// 定义友元函数
void printWidth(Box& b) {
    cout << "Width: " << b.width << endl; // 直接访问私有成员
}

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

友元类例子:

#include <iostream>

using namespace std;

class Box {
private:
    double width;

public:
    Box(double w) : width(w) {}
    friend class BoxInspector; // 声明友元类
};

class BoxInspector {
public:
    void inspect(Box& b) {
        cout << "Box width: " << b.width << endl; // 访问私有成员
    }
};

int main() {
    Box box(20.0);
    BoxInspector inspector;
    inspector.inspect(box);
    return 0;
}

友元函数一个重要的应用是重载运算符 <<,可以直接打印类:

#include <iostream>

using namespace std;

class Complex {
private:
    double real, imag;

public:
    Complex(double r = 0, double i = 0) : real(r), imag(i) {}
    // 声明友元函数重载 <<
    friend ostream& operator<<(ostream& os, const Complex& c);
};

// 定义友元函数
// ostream 是一个输出流的类, std::cout 是其一个实例
// & 表示引用传递,而不是值传递
// 返回类型是 std::ostream&,表示函数需要返回一个对 std::ostream 对象的引用。
// 参数 os 已经是一个引用(std::ostream& os),它绑定到调用时传入的实际流对象(如 std::cout)
ostream& operator<<(ostream& os, const Complex& c) {
    os << c.real << " + " << c.imag << "i"; // 访问私有成员
    return os;
}

int main() {
    Complex c(3.5, 2.0);
    cout << c << endl;
    return 0;
}

相关文章:

  • 假设检验与置信区间在机器学习中的应用
  • 动态内存管理的了解及使用
  • Flink-DataStreamAPI-执行模式
  • C# Enumerable类 之 数据排序
  • 【项目实战】Spring AI集成DeepSeek实战指南(硅基流动平台版)
  • JSAR 基础 1.2.1 基础概念_空间小程序
  • cdn取消接口缓存
  • 2025-03-08 学习记录--C/C++-C 语言 判断一个数是否是完全平方数
  • [网络爬虫] 动态网页抓取 — 概念引入
  • 基于opencv的hsv色块检测
  • vue和easyui渲染问题
  • 代码随想录二刷|图论2
  • Java高频面试之集合-06
  • 深度链接技术解析:openinstall如何通过场景还原优化用户体验?
  • 如何利用Postman对比出新旧接口之间的差异(Diff)
  • dfs:五子棋对弈15蓝桥杯a组1题
  • 数据结构第八节:红黑树(初阶)
  • 【图灵商城项目-登录失败:密码不正确,问题已解决】
  • Python使用MyQR生成动态二维码
  • 【LangChain】理论及应用实战(2)
  • 外企聊营商|威能集团:公平环境增“暖”意
  • 新闻1+1丨城市,如何对青年更友好?
  • 财政部党组召开2025年巡视工作会议暨第一轮巡视动员部署会
  • 汤加附近海域发生6.4级地震
  • 沙青青评《通勤梦魇》︱“人机组合”的通勤之路
  • 国务院办公厅印发《国务院2025年度立法工作计划》