声明一个接受和返回"ostream&"而不是重载operator <<的函数有什么用?

Maz*_*ake 3 c++ operator-overloading

我遇到过函数,而不是重载运算符<<与cout一起使用,声明一个函数,它接受一个ostream并返回一个ostream

例:

#include <iostream>

class A {
private:
  int number;
public:
  A(int n) : number(n) {}
  ~A() {}
  std::ostream& print(std::ostream& os) const;
  friend std::ostream& operator<<(std::ostream& os, const A a);
};
Run Code Online (Sandbox Code Playgroud)

实施的一个例子:

std::ostream& A::print(std::ostream& os) const {
  os << "number " << number;
  return os;
}

std::ostream& operator<<(std::ostream& os, const A a) {
  os << "number " << a.number;
  return os;
}
Run Code Online (Sandbox Code Playgroud)

现在,如果我运行这个,我可以在不同的情况下使用不同的功能.例如

int main() {
  A a(1);

  std::cout << "Object.";  a.print(std::cout);
  std::cout << "\n\n";
  std::cout << "Object." << a;
  std::cout << "\n\n";

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出:

Object.number 1

Object.number 1
Run Code Online (Sandbox Code Playgroud)

似乎没有需要打印功能的情况,因为你只能单独使用或在"cout链"的开头使用,但从不在它的中间或末尾,这可能使它无用.它不会(如果没有找到其他用途)使用函数"void print()"更好吗?

Nim*_*Nim 7

在继承层次结构发挥作用的地方是有意义的.您可以使print方法成为虚拟,并在基类的运算符中委托虚拟方法进行打印.