使用左参数和右参数覆盖运算符

Override operators with a left and right parameter

本文关键字:参数 覆盖 运算符      更新时间:2023-10-16

我有一个简单的设置:

#include<iostream>
class Stuff {};
ostream &operator<<(ostream &lhs, const Stuff &rhs) {
    return lhs << "something";
}
int main() {
    Stuff stuff;
    cout << stuff << endl;
    cin.get();
}

其中operator<<函数将模型Stuff类打印到ostream。我想做的是将该函数移动到Stuff类本身中。如:

class Stuff {
    ostream &operator<<(ostream &lhs, const Stuff &rhs) {
        return lhs << "something";
    }
};
不过,对于

我的生活,我不知道如何让它工作。我感觉我正在尝试从右侧重新定义左关联运算符。有什么方法可以正确地做到这一点吗?

按照你定义它的方式,该函数将是 Stuff 的成员,所以如果C++允许它,你必须像这样称呼它:

Stuff stuff;
stuff.operator<<(std::cout, stuff);

所以你不想要那个。

二元运算符(如<<)接受两个参数(称为操作数)。如果它是一个(非静态)成员函数,那么它必须是接受一个参数的成员函数,其中左操作数是调用函数的对象,右操作数是函数参数。 所以你可以这样做:

struct Stuff {
  std::ostream& operator<<(std::ostream& o) { return o << something; }
};
Stuff s;
s << std::cout << std::endl;

但你可能也不想这样!

若要写入std::cout << s运算符必须是左操作数的成员,或者必须是非成员函数,因此不能使其成为 Stuff 的成员。

也许您要做的是:

class Stuff {
    friend std::ostream& operator<<(std::ostream& lhs, const Stuff& rhs) {
        return lhs << "something";
    }
};

friend函数不是成员函数,因此这是有效的。