C++中重载输出运算符 <<

C++中重载输出运算符 <<

C++输入输出标准库提供了“>>”和“<<”运算符执行输入、输出操作,但标准库只定义了基本数据类型的输入、输出操作,若要直接对类对象进行输入、输出,则需要在类中重载这两个运算符。与其他运算符不同的是,输入、输出运算符只能重载成类的友元函数

通常情况下,输出运算符的第一个形参是一个非常量 ostream 对象的引用。之所以 ostream 是非常量是因为向流写入内容会改变其状

态;而该形参是引用是因为我们无法直接复制一个 ostream 对象。

第二个形参一般来说是一个常量的引用,该常量是我们想要打印的类类型。第二个形参是引用的原因是我们希望避免复制实参;而之所以

该形参可以是常量是因为(通常情况下)打印对象不会改变对象的内容。

为了与其他输出运算符保持一致,operator<< 一般要返回它的 ostream 形参。

Sales_data 的输出运算符

举个例子,我们按照如下形式编写 Sales_data 的输出运算符

ostream &operator<<(ostream &os, const Sales_data &item)
{
    os << item.isbn() << " " << item.units_sold << " " 
       << item.revenue << " " << item.avg_price();
    
    return os;
}

这个函数打印一个 Sales_data 对象意味着要分别打印它的三个数据成员以及通过计算得到的平均销售价格,每个元素以空格隔开。完成

输出后,运算符返回刚刚使用的 ostream 的引用。

输出运算符尽量减少格式化操作

用于内置类型的输出运算符不太考虑格式化操作,尤其不会打印换行符,用户希望类的输出运算符也像如此行事。如果运算符打印了换行

符,则用户就无法在对象的同一行内接着打印一些描述性的文本了。相反,令输出运算符尽量减少格式化操作可以使用户有权控制输出的

细节。

通常,输出运算符应该主要负责打印对象的内容而非控制格式,输出运算符不应该打印换行符。

输入输出运算符必须是非成员函数

与 iostream 标准库兼容的输入输出运算符必须是普通的非成员函数,而不能是类的成员函数。否则,它们的左侧运算对象将是我们的类

的一个对象:

Sales_data data;

data << cout;   //如果operator<<是 Sales_data的成员

假设输入输出运算符是某个类的成员,则它们也必须是 istream 或 ostream 的成员。然而,这两个类属于标准库,并且我们无法给标准

库中的类添加任何成员。

因此,如果我们希望为类自定义 IO 运算符,则必须将其定义成非成员函数。当然,IO 运算符通常需要读写类的非公有数据成员,所以 IO

运算符一般被声明为友元。

该文章会更新,欢迎大家批评指正。

推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码如下: ```c #include <iostream> using namespace std; class Time { private: int hour; int minute; int second; public: Time() : hour(0), minute(0), second(0) {} Time(int h, int m, int s) : hour(h), minute(m), second(s) {} Time operator+(const Time& t) const; friend ostream& operator<<(ostream& os, const Time& t); friend istream& operator>>(istream& is, Time& t); }; Time Time::operator+(const Time& t) const { int h = hour + t.hour; int m = minute + t.minute; int s = second + t.second; if (s >= 60) { s -= 60; m++; } if (m >= 60) { m -= 60; h++; } return Time(h, m, s); } ostream& operator<<(ostream& os, const Time& t) { os << t.hour << ":" << t.minute << ":" << t.second; return os; } istream& operator>>(istream& is, Time& t) { is >> t.hour >> t.minute >> t.second; return is; } int main() { Time t1(12, 30, 45); Time t2(3, 15, 20); Time t3 = t1 + t2; cout << t1 << " + " << t2 << " = " << t3 << endl; cin >> t1; cout << "You entered: " << t1 << endl; return 0; } ``` 解释: - 私有数据成员hour, minute, second表示时、分、秒; - 构造函数Time()表示默认构造函数,初始化时分秒为0;构造函数Time(int h, int m, int s)表示带参数的构造函数,初始化时分秒为h、m、s; - 重载加法运算符+,将两个时间相加,并将结果以Time类型返回; - 重载输出运算符<<,将时间以“时:分:秒”的格式输出; - 重载输入运算符>>,从标准输入流读取“时 分 秒”三个整数,并将它们存入Time对象; - 在main函数,演示了加法运算符重载和输入运算符重载

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值