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

友元函数和友元类

友元

友元是 C++ 提供的一种 打破封装 的机制,允许 友元函数 或 友元类 访问某个类的 非公有成员(private/protected)

友元函数

友元函数 可以 直接访问 类的所有 成员,它是 定义在类外部 普通函数 ,不属于任何类,但需要在类的内部声明,声明时需要加friend 关键字。

运算符重载(<<>>

class Student {
private:std::string name;int age;public:Student(std::string n, int a) : name(n), age(a) {}// 声明友元函数(用于 operator<<)friend std::ostream& operator<<(std::ostream& os, const Student& s);
};// 定义 operator<<(可以访问私有成员)
std::ostream& operator<<(std::ostream& os, const Student& s) {os << "Name: " << s.name << ", Age: " << s.age;return os;
}int main() {Student s("Alice", 20);std::cout << s << std::endl;  // 输出:Name: Alice, Age: 20return 0;
}

假设<<重载为成员函数,那 对象就是第一个参数,cout是第二个参数,使用时就是a << cout

同理,如果>>重载成成员函数,那使用时就是 a >> cin,所以<<和>>不能重载成成员函数

重载为全局函数,那第一个参数就可以设置为cout和cin了,使用时就是cout<<a和 cin>>a,这就对味了,并设置友元函数使其可以直接访问非公有成员

友元类

友元类的所有成员函数都是另一个类的友元函数,友元类的所有成员函数都可以访问另一个类中的非公有成员。
1.友元关系是单向的,不具有交换性。
比如上述Time 类和 Date 类,在 Time 类中声明 Date 类为其友元类,那么可以在 Date 类的成员函数中可以直接访问 Time 类的私有成员变量,但想在Time 类中访问 Date 类中私有的成员变量则不行。
2.友元关系不能传递
如果 B A 的友元, C B 的友元,则不能说明 C A 的友元。
3.友元关系不能继承

内部类

如果一个类定义在另一个类的内部,这个类就叫做内部类
注意 内部类是外部类的友元类
特性:
1. 内部类可以定义在外部类的 public protected private 都是可以的。
2. sizeof( 外部类 )= 外部类,和内部类没有任何关系。

相关文章:

  • Sphinx 文档图片点击放大
  • 每天学一个 Linux 命令(33):uniq
  • DeepSeek R1:强化学习范式的推理强化模型
  • Codeforces Round 1022 (Div. 2) D. Needle in a Numstack(二分)
  • stm32 HAI库 SPI(一)原理
  • 从 “零” 做个开源音乐软件“SteadyBeat”吧!<1> 准备
  • SpringBoot使用自定义校验
  • flux_train_network的参数
  • unity webgl netbox2本地部署打开运行
  • cpper 转 java
  • 数据中台笔记01
  • HCL(HashiCorp Configuration Language)是一种结构化配置语言
  • 组件通信-$refs、$parent
  • Linux-06-磁盘分区类命令
  • 高等数学-第七版-下册 选做记录 习题10-1
  • 邹晓辉教授十余年前关于围棋程序与融智学的思考,体现了对复杂系统本质的深刻洞察,其观点在人工智能发展历程中具有前瞻性意义。我们可以从以下三个维度进行深入解析:
  • 前端面试每日三题 - Day 22
  • 英伟达黄仁勋推荐的深度学习教程
  • aab转apk
  • 【Linux系统】进程间信号(捕捉信号)
  • 10家A股农商行一季报:净利均实现增长,常熟银行营收、净利增速领跑
  • 融创中国清盘聆讯延至8月25日,清盘呈请要求遭到部分债权人反对
  • 准85后青海海北州副州长、州公安局局长李贤荣挂职临沂市副市长
  • 购车补贴、“谷子”消费、特色产品,这些活动亮相五五购物节
  • 两部门预拨4000万元支持山西、广西、陕西做好抗旱救灾工作
  • 平安资管总经理罗水权因个人工作原因辞职