类和对象-C++运算符重载-左移运算符重载

左移运算符重载

#include<bits/stdc++.h>
using namespace std;
class Person
{friend ostream & operator<<(ostream &cout,Person &p);
public:Person(int a,int b){m_A = a;m_B = b;}
private://利用成员函数重载 左移运算符 //p.operaor<<(cout) 简化版本p<<cout//不会利用成员函数重载<<运算符,因为无法实现cout在左侧//void operaor<<(cout)//{ } int m_A;int m_B;};
ostream & operator<<(ostream &cout,Person &p)//本质为 operator<<(cout,p) 简化 cout<<p 
{cout<<"m_A= "<<p.m_A<<" m_B= "<<p.m_B;
}
void test01()
{Person p(10,20);cout<<p<<endl; 
}
int main(){test01();return 0;
}

为什么重载 << 运算符时需要返回 ostream& 类型的引用呢?

1. 链式调用

返回 ostream& 类型的引用允许我们实现链式调用,例如:

cout << p1 << p2 << p3;

这种语法会被编译器解释为:

(((cout << p1) << p2) << p3);

每次 << 运算符重载函数返回的都是 cout 对象的引用,这样才能够连续地将多个对象输出到同一个 cout 流中。

2. 流式输出

C++ 中的 << 运算符经常用于实现流式输出的效果,例如 cout << "Hello" << " " << "World" << endl;。每个 << 运算符都将数据追加到 cout 流中,因此 << 运算符的返回类型必须是 ostream&,以确保可以继续将数据输出到同一个流中。

3. 返回类型为什么是引用

返回引用而不是值的另一个原因是为了避免不必要的对象复制。如果每次 << 运算符返回的是 ostream 对象而不是引用,那么在每次函数调用结束时会产生一个临时的 ostream 对象副本,这不仅效率低下,而且破坏了期望的输出顺序。

因此,返回 ostream& 类型的引用是为了支持链式调用和流式输出的正确性和效率。这也是 C++ 中惯例和推荐的做法。

为什么要将 m_A 和 m_B 私有化?

  1. 封装性和安全性: 将数据成员声明为私有的意味着它们只能被 Person 类的成员函数访问,而外部代码不能直接访问或修改这些成员。这样做提高了类的封装性,避免了数据被不相关的代码误用或修改。

  2. 数据访问控制: 通过公开的构造函数 Person(int a, int b),类的使用者可以在创建对象时初始化 m_Am_B,而后续的访问和修改必须通过类的公有接口或者友元函数来进行,从而保证了数据的安全性和一致性。

  3. 友元函数访问: 尽管 m_Am_B 是私有的,但 operator<< 被声明为 Person 类的友元函数,可以访问 Person 对象的私有成员。这样做既保留了数据的封装性,又允许特定函数或类进行必要的数据操作,例如输出 Person 对象的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/42028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(软件06)串口屏的应用,让你的产品显得高级一点(下篇)

本文目录 学习前言 单片机代码实现 学习前言 目前市面上我记得好像有IIC的屏幕、SPI的屏幕、并口屏幕、还有就是今天我们介绍的这个串口屏了&#xff0c;串口屏&#xff0c;就是用串口进行通讯的&#xff0c;上篇我们已经介绍了屏幕供应商提供的上位机软件进行配置好了&#…

java类复制mapstruct(convertor转换器)

背景&#xff1a; 类拷贝或属性拷贝&#xff0c;采用BeanUtil会用反射&#xff0c;性能不佳 BeanUtil.copyProperties(eventsInputDto, satisfyRiskDTO) 常见转换场景&#xff1a; 1、通过字段的值&#xff0c;条件判断赋值 三目运算判断赋值&#xff1a; expression &qu…

JDK-反应流(响应式流)

归档 GitHub: JDK-反应流&#xff08;响应式流&#xff09; 使用示例 https://github.com/zengxf/small-frame-demo/blob/master/multi-thread/reactive-test/reactor-demo/src/main/java/cn/zxf/reactor_demo/jdk/PubSubTest.java JDK 版本 openjdk version "17&quo…

自动化鼠标和键盘操作的软件,KeymouseGo是一款功能强大、易于使用的自动化工具,它能够帮助我们从重复性工作中解放出来.

重复性工作常常让我们的双手疲惫不堪。幸运的是&#xff0c;技术的进步为我们提供了自动化解决方案。今天&#xff0c;我们将探讨一款名为KeymouseGo的开源免费软件&#xff0c;它能够记录并自动执行鼠标和键盘操作&#xff0c;从而帮助我们从单调重复的任务中解放出来。 软件…

贪心算法-以学籍管理系统为例

1.贪心算法介绍 1.算法思路 贪心算法的基本思路是从问题的某一个初始解出发一步一步地进行&#xff0c;根据某个优化测度&#xff0c;每一 步都要确保能获得局部最优解。每一步只考虑一 个数据&#xff0c;其选取应该满足局部优化的条件。若下 一个数据和部分最优解连在一起…

单选多选提交问卷,代码示例

&#xff45;&#xff4c;&#xff45;&#xff4d;&#xff45;&#xff4e;&#xff54;中 需要对接口返回的数据进行分析。多选问题使用checkbox&#xff0c;单选题使用radio。 多选时可以绑定&#xff4d;&#xff49;&#xff4e;&#xff0f;&#xff4d;&#xff41;&am…

CS61B Data Structure-Jonathan Lecture2 using objects - OBJECTS METHODS

Recall String s1; // Step 1: declare a String variable s1 new String(); // Step 2: assign it a value, a new empty string objectString s2 new String(); // 1&2 combined今日知识点 situation: pointing to the same object s1 "Yow!";s2 s1; //…

onclick和@click有什么区别,究竟哪个更好使?

哈喽小伙伴们大家好,我是爱学英语的程序员,今天来给大家分享一些关于vue中事件绑定相关的内容,希望对大家有所帮助. 场景是这样的:我要实现一个切换栏,默认激活的是第一个标签,当鼠标移动到第二个标签是,对应的内容让激活.起初,我第一时间想到的是用element plus的组件来实现这…

[leetcode hot 150]第一百一十七题,填充每个节点的下一个右侧节点

题目&#xff1a; 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。 初始状态下&#x…

NVIDIA的vGPU技术或AMD的MxGPU技术

目录 将物理GPU资源切分为多个虚拟GPU(vGPU) 实现步骤 技术示例 优点与挑战 结论 NVIDIA的vGPU技术或AMD的MxGPU技术 NVIDIA的vGPU技术 AMD的MxGPU技术 将物理GPU资源切分为多个虚拟GPU(vGPU) 将物理GPU资源切分为多个虚拟GPU(vGPU)主要依赖于GPU虚拟化技术。这种…

pytorch LLM训练过程中的精度调试实践

pytorch LLM训练过程中的精度调试实践 1.查看权值的最大,最小值2.检测训练过程中的异常值A.通过hook module,检测异常值B.拦截算子,检测异常值,打印调用栈,保存输入参数,方便复现C.拦截算子,同时执行cpu计算,对比误差,找到第一个精度异常的算子D.以上的代码 3.根据上面dump的数…

dreamerV3 控制人形机器人行走举例

DreamerV3模型 DreamerV3 是一种先进的强化学习算法,它结合了模型预测控制(MPC)和深度学习,能够在复杂环境中实现高效的学习和控制。DreamerV3 通过构建环境的动态模型并使用该模型进行多步预测和优化,来学习复杂任务如人形机器人行走。 DreamerV3 原理简介 DreamerV3 …

flutter背景贴图的困难总结

需求&#xff1a;一张前景图&#xff0c;一张背景图。背景图可以放大缩小&#xff0c;可以平移。 复盘一下整个烦闷之旅。 困难一&#xff0c;保存成文件。 遇到了几个十分难受的问题。 现在回看是很简单&#xff0c;代码也没几行&#xff0c;可中间的思考过程是十分痛苦的&a…

FPGA_HDLBits:2.2Vectors2.3ModulesHierarchy

FPGA_HDLBits:2.2Vectors&2.3ModulesHierarchy 说明:仅对自己做的HDL Bits中的2.2-2.3章节题目的错误部分做的记录&#xff0c;正确的也就没有记录&#xff0c;可以理解为个人的错题本 对于reg [15:0]input input[0:7]是调用低位而不是取最高位&#xff0c;而且调的是最低…

SpringSecurity6.x使用教程

SpringSecurity6.x使用 SpringSecurity版本 SpringSecurity目前支持的版本如下图所示&#xff0c;可以看到5.x的版本过几年就不会再维护了&#xff0c;6.x将成为主流。 入门 引入依赖 <dependency><groupId>org.springframework.boot</groupId><arti…

CMS Made Simple v2.2.15 远程命令执行漏洞(CVE-2022-23906)

前言 CVE-2022-23906 是一个远程命令执行&#xff08;RCE&#xff09;漏洞&#xff0c;存在于 CMS Made Simple v2.2.15 中。该漏洞通过上传头像功能进行利用&#xff0c;攻击者可以上传一个经过特殊构造的图片文件来触发漏洞。 漏洞详情 CMS Made Simple v2.2.15 中的头像上…

【C++/STL】优先级队列的介绍与模拟实现仿函数

✨ 万物与我皆是自由诗 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1…

关于string的‘\0‘与string,vector构造特点加部分特别知识点的讨论

目录 前言&#xff1a; 问题一&#xff1a;关于string的\0问题讨论 问题二&#xff1a;C标准库中的string内存是分配在堆上面吗&#xff1f; 问题三&#xff1a;string与vector的capacity大小设计的特点 问题四&#xff1a;string的流提取问题 问题五&#xff1a;迭代器失…

unity 使用UnityWebRequest从服务器下载

IEnumerator WinFile(string url){//连接urlusing(UnityWebRequest uwr UnityWebRequest.Get(url)){//等待下载yield return uwr.SendWebRequest();//判断是否连接失败以及是否返回一个错误状态码if (uwr.result UnityWebRequest.Result.ConnectionError || uwr.result Unit…

04.ffmpeg打印音视频媒体信息

目录 1、相关头文件 2、相关结构体 3、相关函数 4、函数详解 5、源码附上 1、相关头文件 #include <libavformat/avformat.h> 包含格式相关的函数和数据结构 #include <libavutil/avutil.h> 包含一些通用实用函数 2、相关结构体 AV…