August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
为一个给定类型定义输出运算符<<,是一件很简单的事情。要考虑的主要问题是不同人可能喜欢不同的输出形式,因此很难达成共识来确定一个单一的格式。但即便无法提供一个令所有人都满意的单一输出格式,为用户自定义类型定义输出运算符<<,通常也是一个好的策略。这样,我们至少可以在调试和早期开发期间,很容易地输出这个类型的对象。接下来,我们还可以提供一个更为复杂的<<,允许用户给出格式信息。而且,如果我们希望输出样式与<<提供的不同,可以简单地绕过<<,按照我们希望的格式直接输出用户自定义类型中的内容。
下面是为9.8节中Date类型定义的一个简单的输出运算符,它简单地打印年、月、日,中间用逗号分隔,两边加括号:
这个输出运算符会将2004年8月30日打印为“(2004,8,30)”的形式。这种简单的成员列表的表示方式,对于成员数较少的类型来说很适合,除非我们有更好的想法或者更特殊的需求。
在9.6节中,我们提到,处理一个用户自定义运算符,实际是调用对应的函数。下面的例子演示了这一处理过程,假定已经为Date定义了上面的<<操作符,那么
其中d1是Date类型的对象,等价于下面的调用:
需要注意operator<<()是如何接受一个ostream&作为第一个参数,又将其作为返回值返回的。这就是为什么可以将输出操作“链接”起来的原因,因为输出流按这种方式逐步传递下去了。例如,可以像下面这样输出两个日期: ...