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

C++第九篇:friend友元

1.友元的三个特点

  • 单向性:A类中写了friend class B,说明B可以调用A中的函数,但过来不可以。
  • 不可传递性:A类中写了friend class B,B类又写了friend class C,但C类并不能调用A类中的函数。
  • 不可继承性:B类还有一个子类C,C类并不能算A类的友元,不可以调用A的函数。

2.友元函数

在 C++ 中,友元函数 是一种特殊的函数,它不属于某个类,但被允许访问该类的私有成员保护成员,打破了类的封装性限制。

友元函数可以直接访问类中的保护成员私有成员,直接看代码示例:

#include <iostream>using namespace std;class MyClass {
private:int x; int y;public:MyClass(int a, int b) : x(a), y(b) {}// 声明友元函数:该函数不是MyClass的成员,但可访问其私有成员friend int sum(MyClass obj); 
};// 友元函数的实现(在类外,无需加类名和作用域运算符::)
int sum(MyClass obj) {//这里传引用更好MyClass& obj// 可以直接访问MyClass的私有成员x和yreturn obj.x + obj.y; 
}int main() {MyClass obj(3, 5);cout << "sum : " << sum(obj) << endl; // 输出 sum : 8return 0;
}

运行结果:

示例中经过friend声明过后,sum函数就可以直接访问私有和保护成员,当然,前提是你得将对象当做参数传过来,因为友元函数不是类的成员,没有隐藏的this指针,只有通过这样才可以,使用引用更好。

3.友元成员函数

友元成员函数是指一个类的成员函数被另一个类声明为 “友元”,从而使得该成员函数能够访问另一个类的私有成员和保护成员。

代码如下:

#include <iostream>
using namespace std;// 声明类B,因为A的成员函数需要使用B
class B;// 定义类A
class A {
public:void printB(B* b);
};// 定义类B
class B {
private:int num = 100;// 声明A的成员函数printB为B的友元friend void A::printB(B* b);
};//友元函数的定义
void A::printB(B* b) {cout << "B的私有成员num:" << b->num << endl;
}int main() {A a;B b;a.printB(&b); // 输出:B的私有成员num:100return 0;
}

结果:

这里和前面的类型知识将函数改为了类的成员函数,注意声明友元函数是的写法即可。

4.友元类

如果类 A 声明类 B 为友元类,那么类 B 的所有成员函数都可以访问类 A 的私有和保护(成员,无需逐个声明函数。

    看代码:

    #include <iostream>
    using namespace std;class A {
    private:int secret; // 私有成员
    public:A(int s) : secret(s) {}// 声明类B为友元类:B的所有成员函数可访问A的私有成员,// 但A的成员函数不能访问B的私有成员,具有单向性friend class B; 
    };class B {
    public:void printSecret(A& a) {cout << "A的私有成员:" << a.secret << endl; }void modifySecret(A& a, int newVal) {a.secret = newVal; // 直接修改A的私有成员}
    };int main() {A a(100);B b;b.printSecret(a); // 输出:A的私有成员:100b.modifySecret(a, 200);b.printSecret(a); // 输出:A的私有成员:200return 0;
    }

    结果如下:

    这里只需要牢记友元类的特点就可以了。

    http://www.dtcms.com/a/411275.html

    相关文章:

  • 软件工程咋理解?用 “开奶茶店” 讲透瀑布模型 / 敏捷开发
  • 如何在WordPress中添加短代码
  • 资源型网站建设 需要多大硬盘招牌设计 创意logo
  • 数据库索引简介
  • 基于三角测量拓扑聚合优化的LSTM深度学习网络模型(TTAO-LSTM)的一维时间序列预测算法matlab仿真
  • 关键词网站查询产品展示网站源码php
  • TOGAF ® 标准与循环经济:为可持续与责任型 IT 而设计
  • C盘内存不足,清除或转移VS2022缓存文件Cache
  • 玉米病叶识别数据集,可识别褐斑,玉米锈病,玉米黑粉病,霜霉病,灰叶斑点,叶枯病等,使用yolo,coco,voc对4924张照片进行标注
  • 修改Linux上的ssh的默认端口号——及其客户端使用ssh连接不上Linux问题排查解决
  • 连接世界:网络请求 `wx.request`
  • 安徽省建设厅网站打不开批量导文章到wordpress
  • 用一个OneKey MCP把付费的AI Agent MCP的价格打下来 - DeepNLP OneKey MCP Agent Router项目
  • 绿算技术与清智图灵完成产品兼容性互认证
  • 成都微信网站开发黄骅贴吧
  • Redis监控告警体系搭建:使用Redis Exporter + Prometheus + Grafana
  • 制作网站价格不一wordpress 英文月份
  • 深入解析 Redis 单线程 IO 模型:从架构到多路复用技术
  • 【mysql】数据误删了? 关键时刻可以通过binlog挽救
  • MySQL核心操作:从插入到查询全解析
  • gRPC从0到1系列【1】
  • 网站建设电影WordPress发表心情
  • php做网站的优势网站建设方案的所属行业是
  • java-stream流
  • spiffs分区文件系统在esp idf的创建
  • php网站开发技术描述南昌seo网站排名
  • html5微网站做网站原型图软件
  • 86-python电网可视化项目-6
  • 长乐住房和城乡建设局网站wordpress文章页面
  • 技术拐点将至:AI 大模型的挑战突围与产业重构