ostream重载

时间:2011-05-26 16:14:00

标签: c++ oop operator-overloading

friend ostream& operator<<(ostream& os, MyClass& obj);

我有几个问题:
1.为什么我需要写'朋友'? 2.为什么我需要写'&amp;'在'operator','os'和'obj'之前?

2 个答案:

答案 0 :(得分:0)

&中的MyClass&使该函数将引用带到MyClass对象,而不是对象本身。 (同样适用于其他人。)

引用是轻量级的,并且您对obj所做的任何更改都会影响原始对象。如果没有&,你将指示编译器在调用中构造一个全新的MyClass,在返回时销毁它并丢弃你可能对其内部状态所做的任何更改。

ostream&的返回通常用于返回相同的ostream&amp;这是传递给你的,所以你可以像cout << "hello " << 42 << endl;那样写出一系列的转变,让它们按你期望的方式行事。 (你可以让它返回一些不同的东西--C ++让人们很容易完全弄乱人们的期望 - 但是不要这样做。)

答案 1 :(得分:0)

即可。为什么我需要写'朋友'?

ostream更改左参数(改变流的状态),因此根据一般运算符重载语义,它应该实现为左操作数类型的成员。但是,它的左操作数是来自标准库的流,当您为自己的类型实现输出和输入操作时,您无法更改标准库的流类型。这就是为什么你需要为你自己的类型实现这些运算符作为非成员函数。