2010-07-23 32 views
6

为什么流操作员(<,<,>>)的重载应该保持为朋友而不是让他们成为班级的成员?Stream Operator Overloading

+3

当功能与班级的私人成员发生关系时,它使编程变得更加激动人心。 – zneak 2010-07-23 22:08:30

回答

9

当您将二元运算符重载为类的成员函数时,当第一个操作数属于类类型时,将使用过载。

对于流操作符,第一个操作数是流而不是(通常)是自定义类。

由于这个原因,被设计为以传统方式使用的自定义类的重载流操作符不能是自定义类的成员函数,它们必须是自由函数。 (我假设流类没有打开改变;如果他们是你可以添加成员函数来流类来处理额外的自定义类型,但从依赖性的角度来看,这通常是不受欢迎的。 )

他们是不是朋友应该取决于他们是否需要接触非公开的班级成员。

+0

我认为这有点误导。它们*可以是成员函数,但是通常使用它们(写入流),它们需要是成员函数。 – 2010-07-23 22:13:32

+0

@sztomi:我不明白你的意见。不,他们不需要担任成员职能;它们不能成为成员函数(除非你正在编写流类或从世界其他地方向后写流媒体运算符)。 – 2010-07-23 22:17:03

+0

所以是的,他们可以是成员函数。如果你希望他们像平常一样工作(就像这个词的其他部分使用它),你必须将它们定义为朋友。我正是这个意思。 – 2010-07-23 22:19:46

0

什么类的成员?什么是左手操作数的类型?

但是,它们不一定是friend,除非需要访问其他不可访问的私人数据。

2

所以,你可以说:

some_stream << my_class; 

注意,成员操作符的定义使得左侧的类它的自我。例如:

my_class << some_stream; 

这不是标准流应该如何工作。