在 cpp 中重载<<运算符的正确方法是什么



我尝试重载<<操作符直接显示在类的公共部分,但它不起作用

ostream& operator<< (ostream& output, const Box& B){
output << B.l << " " << B.b << " " << B.h;
return output;
}

我尝试重载<<上面所示的操作符直接放入类的公共部分,但它不起作用,在询问了一个高级程序员之后,他在类的外面写了这个&设置为好友函数:

friend ostream& operator<< (ostream& output, const Box& B){
output << B.l << " " << B.b << " " << B.h;
return output;
}

在这个伪示例中

class Thing
{
...
void work(int arg);
...
};

成员函数是隐式地以Thing作为第一个参数的函数,就像my_thing.work(12)work(my_thing, 12)一样。这绝对不是一个有效的替代,但它只是给出了解释的其余部分的想法。

回到您的示例,当您编写std::cout << my_box时,编译器将操作符<<理解为这个函数调用operator<<(std::cout, my_box)。如果Boxoperator<<std::cout的成员函数,这可以工作,但实际上标准流不知道任何关于Box类型的信息。

如果您提供operator<<作为Box的成员函数,那么这意味着左操作数应该是Box,它可以被认为是上面伪示例中描述的隐藏的第一个参数。但是当你写std::cout << my_box时,左操作数不是Box,而是std::cout

在这种情况下,唯一的解决方案是提供一个非成员。函数中使用正确顺序的预期参数,因此您尝试的第二个解决方案可以正常工作。

相关内容

最新更新