2011-05-26 50 views
0
friend ostream& operator<<(ostream& os, MyClass& obj); 

我拥有电子几个问题:
1.为什么我需要写“朋友”?
2.为什么我需要在'operator','os'和'obj'之前写'&'?ostream的超载

+1

重复的排序http://stackoverflow.com/questions/236801/should-operator-be-implemented-as-a-friend-or-as-a-member-function – SteveMc 2011-05-26 16:19:23

回答

0

& in MyClass&使参数参考到MyClass对象,而不是对象本身。 (与其他类似)

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

ostream&的回报通常用于返回相同的ostream &那是,所以你可以编写cout << "hello " << 42 << endl;移链,并让他们的行为你期望的方式通过。 (您可能使其返回不同的东西 - C++可以很容易地完全混乱与人们的预期 - 但不这样做。)

+1

不**返回* *(MyClass的引用或对象),它**接受** MyClass。 – 2011-05-26 16:42:40

+0

@Rob哎呀!大脑失败。固定 - 谢谢。 – crazyscot 2011-05-26 17:04:42

0

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

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