如何在 C++ 中重载 << 运算符以重复使用?

how to overload << operator in c++ to use repeatedly?

抱歉标题不明确。 最近开始学习C++,不知道如何重载运算符<<使其可重复

这是一个示例代码。

class Foo{
private:
int* a;
int idx = 0;

public:
Foo(){a = new int[100];
void operator<< (int a) {arr[idx++] = a;}

<<所做的基本上是class获取整数作为操作数并将其保存到arr。(此处忽略溢出情况)

例如,a << 100 会将 100 添加到数组中。

我想做的是使 << 运算符可以像 a << 100 << 200 一样重复使用内联 我应该如何修复上面的代码以允许此功能?

提前致谢:)

Return 对 *this 的引用。它无关紧要,但您应该使用向量来避免内存泄漏。尽量避免原始 new

class Foo{
private:
    std::vector<int> a;

public:
    Foo &operator<< (int a) {
        arr.push_back(a);
        return *this;
    }
};

重载的 Foo::operator<<() 实际上有两个参数:

  1. 右边给出的参数int
  2. 左侧的隐式 this

要允许链接此运算符,它应该 return 对左侧的引用(即 *this)使其在左侧可用。

示例代码:

#include <iostream>

struct Foo {
  Foo& operator<<(int a)
  {
    std::cout << ' ' << a;
    return *this;
  }
};

int main()
{
  Foo foo;
  foo << 1 << 2 << 3;
}

输出:

 1 2 3

Live demo on coliru

通过返回对实例的引用启用链接,这样您就可以调用另一个方法:

class Foo{
private:
    std::vector<int> a;   
public:
    Foo(){}
    Foo& operator<< (int a) {
        arr.push_back(a);
        return *this;
    }
};

现在您可以调用 f << 100 << 200 << 42;

请注意,我用 std::vector 替换了数组以减少 Foo 损坏(除非你有一个你没有显示它正在泄漏内存的 descrutor,你可以修复它,但随后仍然复制会导致问题,简而言之,当您拥有资源时,您需要遵守 3/5 规则,使用 std::vector 会使事情变得简单得多)。

PS:其他方法同样适用。您只需在返回的 this 引用上调用另一个方法。请注意,运算符只是方法(带有一些语法糖),您也可以编写 f.operator<<(100).operator<<(200).operator<<(42);.