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

C++运算符重载

上一次我们说了其他的运算符,像 "+" "+=" "=" 等运算符的重载,但是在C++中,我们还有一些运算符,<</>>就是流插入和流提取,以及我们上次说了其他的四个默认函数,剩余的两个默认函数我们今天来讲。

operator<<

我们先讲operator<<流插入重载

 我们先看一下,流插入,我们现在输出a,然后我们就输出了a的值

我们现在继续输出,我们还同时输出了d的值,那么我们现在还是以日期类为例,如果们像输出日期类,我们直接这样可以吗??

 

我们像直接这样输出可以吗??

不可以,首先这里要说明一下,我们的<<可以输出int/double等是因为函数重载,我们之前也是说过的,我们的函数名字相同的参数不同就可以构成函数重载,而int/double等这些是内置类型,所以,<<知道如何输出,但是我们的Date类型是我们的自定义类型,编译器并不知道应该如何输出,所以我们需要对<<进行重载,我们自己定义如何输出

 

我们这里来看一下,实际上我们的<<都是重载,而我们的cout实际上就是ostream,这里涉及到了继承那一块所以不说

 

就是这样,而cin涉及带了istream ,而他们最后都是iostream

所以我们的cout/cin都是iostream里面的类,而cout是ostream, cin 是istream

所以我们现在开始看一下operator<<如和实现

我们来看一下,在我们的类中,我们这样写正确吗??

我们来调用看一下

 我们现在,像这样调用 是不正确的,应为我们知道,我们的成员函数里面有this指针,所以第一个参数传给了this指针,但是我们的第一个参数是cout而我们的this指针式Date*类型的,所以我们传值的位置错了,所以我们需要这样调用

这样就ok了,那么我们来看一下是否能成功

 

没问题

那么这样写实在式不合逻辑,但是我们还可以这样写

 

到那时这样也并不太美观,这也并不是我们想要的效果,我们想要的是cout在前面,但是在成员函数中我们的第一个值永远是this指针,所以我们第一个值肯定是对象,所以我们不能让他成为成员函数,我们可以让他是全局函数

 

所以我们现在把他 实现为全局函数,这样就没有有this指针了,我们就可以让ostream是第一个参数了,但是这样可以吗??

我们想一下,现在这个函数是全局函数,而我们这里需要访问Date类中的private成员变量,所以是不可以的,所以这里想要可以的话,我们就需要吧private的成员变量给public

但是我们不想把private改成public呢??

我们可以提提供一个GetYear( )GetMonth( )GetDay( )的函数,这样我们就可以了,但是我们还有一种方法友元函数

友元函数

这里我们插入宇哥话题,友元函数,就是让一个函数是这个类的盆友,所以这个函数可以访问这个类里面的private成员函数

所以这里我们先声明,声明该函数是友元函数,其中operator>>也是这样

 

我们现在实现,这样就OK了 

但是我们这里看到,我们这里是可以连续输出的,这里和我们的赋值有点像,所以这里我们的operator是不可以连续赋值的,所以我们还是需要把cout返回出去,所以我们正真应该是这样的

 

我们现在在看一下,是否可以

 

我们现在就可以了,即使我们没有把private改成public

operator>>

当然我们的operator>>也是和operator<<基本相同

 

就是这样 ,我们不多解释

下面我们来说一下剩下的两个默认成员函数

operator&()

operator&( )const

我们看到的是我们是对&重载,其实这个我们基本不会使用

ok,就是这样,但是这里如果我们不想被取地址的话我们可以这样

 

这样我们就不会被取地址了

Date类和运算符重载就到这了 


http://www.kler.cn/a/18475.html

相关文章:

  • Mysql前言
  • 番外:MySQL的一些事务处理
  • YOLOV8应用|排球垫球计数|附带全部数据集与源码(见文末百度云盘链接)
  • Go语言中的`io.Pipe`:实现进程间通信的利器
  • SQLI LABS | Less-40 GET-BLIND Based-String-Stacked
  • 绘制3D图
  • 可视化绘图技巧100篇分析篇(二)-生存曲线(LM曲线)(补充篇)
  • EMC VNX登录Unisphere错误 certificate has invalid date问题处理
  • DC-8通关详解
  • orin配置系统
  • api数据接口文档_接口文档示例(以1688平台API接口文档实例演示)
  • HID Relay, 有线键盘转蓝牙项目学习:记一次失败的尝试
  • 密码学:古典密码.
  • 创新驱动 共建生态|鲲鹏开发者峰会2023·GBASE南大通用技术论坛成功举办
  • Docker run命令
  • WebRTC源码目录结构
  • 欧几里得算法,辗转相除法的证明
  • 思科网络交换机配置命令(详细命令总结归纳)
  • 手把手带你进入爬虫的世界
  • 4种智能指针
  • PMP证书“扫盲”时间2023年考证人快看过来
  • 基于springboot的医院信管系统
  • 备忘录模式
  • 网络路径下倾斜模型生产流程-空三计算,像控刺点
  • vue_组件基础
  • chatgpt的150个指令大全