前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >EasyC++67,<< 运算符重载

EasyC++67,<< 运算符重载

作者头像
TechFlow-承志
发布2022-08-26 17:29:12
1660
发布2022-08-26 17:29:12
举报
文章被收录于专栏:TechFlow

作者 | 梁唐

大家好,我是梁唐。

这是EasyC++系列的第67篇,来聊聊<< 运算符重载。

重载<<运算符

我们可以对<<运算符进行重载,这样做的好处是我们可以直接使用cout来进行输出。有些类似于Java当中实现toString方法。虽然概念简单,但是实际实现要稍稍复杂一些,我们一点点来说。

还是以之前的Time类为例,假设trip是Time类的一个对象,为了显示它的值,之前是开发了show函数。如果重载了<<运算符之后,我们可以这样输出:

代码语言:javascript
复制
cout << trip;

显然<<是可以被重载的运算符,实际上在C++当中,它已经被重载很多次了。

<<最原本的含义是左移,这是一个位运算,i << 1,表示将i左移一位。由于C++当中整数都以二进制存储,所以这表示i *= 2cout是一个ostream对象,它能够识别所有的C++基本类型,它对所有的基本类型都重载了operator<<

现在我们要做的就是重载Time类中的<<运算符。

版本一

我们必须要使用友元函数,因为<<操作符的运算对象并不是Time,而是cout。大概是这个样子:

代码语言:javascript
复制
void operator<<(ostream &os, const Time &t) {
    os << t.hours << " hours, " << t.minutes << " minutes.";
}

版本二

这个版本看起来一切正常,但是有一个缺陷,就是无法执行如下的连续输出:

代码语言:javascript
复制
cout << "Trip Time: " << trip << endl;

当我们使用cout进行连续输出cout << x << y,它的本质是(cout << x) << y。也就是说cout << x的返回结果同样是一个ostream的对象。既然如此,我们只需要将上面的版本改下即可:

代码语言:javascript
复制
ostream& operator<<(ostream &os, const Time &t) {
    os << t.hours << " hours, " << t.minutes << " minutes.";
    return os;
}

注意这里返回的类型是ostream对象的引用,因为函数开始执行的时候,程序传递的就是一个对象的引用,现在又返回回去,也就是说将传递进来的对象又返回了回去。

这样一来才算是真正实现了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Coder梁 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 重载<<运算符
    • 版本一
      • 版本二
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档