我刚刚为我的编程课做了一次测验,错了这个问题:
重载运算符
<<
的返回类型必须是一个指向ostream对象的引用。
我觉得这不太对。毕竟C++应该更加开放才对。但我还是想在这里问问。这是怎么回事(对或错)?当涉及到运算符重载时,我的C++知识开始真正消退了..
我刚刚为我的编程课做了一次测验,错了这个问题:
重载运算符
<<
的返回类型必须是一个指向ostream对象的引用。
我觉得这不太对。毕竟C++应该更加开放才对。但我还是想在这里问问。这是怎么回事(对或错)?当涉及到运算符重载时,我的C++知识开始真正消退了..
C++并不要求返回类型是一个指向ostream
对象的引用。然而,如果您想要做这样的事情:
cout << instance_of_custom_type << 3 << "hi" << endl;
ostream &operator << (ostream &os, custom_type &t);
然而,如果您正在编写一个大整数类型,并希望支持位移操作,那么可能会像这样:
BigInt operator << (const BigInt &i, unsigned int shift);
<<
运算符最初的用途是进行位移操作。例如,1 << 8
的结果是256。C++增加了一个(稍微有点混淆的)第二种用法,并在 ostream
上对其进行了重载,表示向流中输出内容。你可以在重载运算符中进行任何操作 - 它的工作方式就像一个函数一样,但是运算符会有一个人类预期:在 C++ 中,程序员期望 <<
是位移或流输出操作。将返回类型设置为对传递给重载插入运算符的相同流对象的引用参数的引用,使我们能够编写以下代码:
mystream &operator << (mystream &os, myclass &myobject){
// do whatever
return os;
}
mystream << myobject << fundamental_type_object;
重载运算符
<<
的返回类型必须是对ostream
对象的引用。
说“必须”是不正确的,可能“通常”是正确的词,为什么呢?因为正如大多数答案已经指出的那样,在使用iostreams
时,它提供了对象链接
的便利。
operator<<
应该始终返回其左操作数,以便链式调用,就像 operator=
一样。<iostreams>
库时,这恰好是对 std::ostream
的引用。这不是正确的。只有在iostreams的上下文中才是正确的,在我可能不相关和无趣的意见中,iostreams永远不应该以那种形式被放出来。如果您的代码中不包括iostreams,您可以随心所欲地做任何事情。但是我不会重载这些运算符来做除了通过整数值或者可能通过某种方式将类减少为整数值的类之外的任何事情。