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
运算符一般被声明为友元。
该文章会更新,欢迎大家批评指正。文章来源:https://www.toymoban.com/news/detail-538974.html
推荐一个零声学院免费公开课程,个人觉得老师讲得不错,
分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:
服务器课程:C++服务器文章来源地址https://www.toymoban.com/news/detail-538974.html
到了这里,关于C++中重载输出运算符 <<的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!