Class 为什么朋友函数的返回类型重载了<<&引用;操作员必须是参考人吗? friend-ostream&operator

Class 为什么朋友函数的返回类型重载了<<&引用;操作员必须是参考人吗? friend-ostream&operator,class,c++11,overloading,pass-by-reference,friend,Class,C++11,Overloading,Pass By Reference,Friend,按值返回意味着需要复制对象,否则它可能无效,这对于流可能会造成问题,因为调用其析构函数时,原始(复制源)对象可能会在自身之后进行清理。通过引用返回避免了这一点,更重要的是,链式调用将共享相同的ostream,而不是在每次通过值返回后共享一个新流,这意味着需要复制对象,否则它可能无效,这对于流来说可能会造成与原始(副本源)相同的问题当调用其析构函数时,对象可能会自行清理。通过引用返回可以避免这种情况,更重要的是,链式调用将共享相同的ostream,而不是在每个之后共享一个新流。这不是严格的要求。如

按值返回意味着需要复制对象,否则它可能无效,这对于流可能会造成问题,因为调用其析构函数时,原始(复制源)对象可能会在自身之后进行清理。通过引用返回避免了这一点,更重要的是,链式调用将共享相同的
ostream
,而不是在每次
通过值返回后共享一个新流,这意味着需要复制对象,否则它可能无效,这对于流来说可能会造成与原始(副本源)相同的问题当调用其析构函数时,对象可能会自行清理。通过引用返回可以避免这种情况,更重要的是,链式调用将共享相同的
ostream
,而不是在每个
之后共享一个新流。这不是严格的要求。如果使用非参考版本

friend ostream operator<<( ostream&, Complex&);

ostream这不是一个严格的要求。如果使用非参考版本

friend ostream operator<<( ostream&, Complex&);

ostream
std::ostream
明确阻止您复制它。请注意,它有一个已删除的副本构造函数


因此,如果您试图按值返回它,将导致编译器错误。

std::ostream
明确阻止您复制它。请注意,它有一个已删除的副本构造函数

因此,如果您试图按值返回它,则会导致编译器错误。

不必如此,但有几个原因可以解释为什么这是一个常见的选择

许多处理流的STL类和对象通常选择通过引用返回,因为这允许链接

ostream << a << b << c
class-MyClass{
公众:
MyClass(intV):值(v){}
int值;
friend MyClass&operator不必这么做,但有几个原因可以解释为什么这是一个常见的选择

许多处理流的STL类和对象通常选择通过引用返回,因为这允许链接

ostream << a << b << c
class-MyClass{
公众:
MyClass(intV):值(v){}
int值;
friend MyClass&运算符
a << b; // Can't chain
a << c;
class MyClass {
  public:

  MyClass(std::string str) {
    ss << str;
  }
  std::stringstream ss; // This CANNOT be copied

  friend MyClass operator<<( MyClass&, MyClass& );

};

MyClass operator<< (MyClass& a, MyClass& b) {
    a.ss << b.ss.str();
    return a; // Can't do this! Copy ctor is implicitly deleted due to ss
}