>> 和 << 运算符重载

6

我刚刚为我的编程课做了一次测验,错了这个问题:

重载运算符<<的返回类型必须是一个指向ostream对象的引用。

我觉得这不太对。毕竟C++应该更加开放才对。但我还是想在这里问问。这是怎么回事(对或错)?当涉及到运算符重载时,我的C++知识开始真正消退了..


3
对我来说,这似乎是一个措辞不当的问题,老师显然是在流操作符的上下文中提出的,但没有明确说明。操作符重载并不强制执行任何限制,因此你的答案是正确的,我鼓励你告诉他们他们的愚蠢 :) - radman
@radman 我已经给我的老师发了邮件关于这个问题,现在正在等待回复。 - Earlz
6个回答

19

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++ 中,程序员期望 << 是位移或流输出操作。

2

将返回类型设置为对传递给重载插入运算符的相同流对象的引用参数的引用,使我们能够编写以下代码:

mystream &operator << (mystream &os, myclass &myobject){
   // do whatever
   return os;
}

mystream << myobject << fundamental_type_object;

2

重载运算符<<的返回类型必须是对ostream对象的引用。

说“必须”是不正确的,可能“通常”是正确的词,为什么呢?因为正如大多数答案已经指出的那样,在使用iostreams时,它提供了对象链接的便利。


1
从更一般的角度来看,operator<< 应该始终返回其左操作数,以便链式调用,就像 operator= 一样。
当处理 <iostreams> 库时,这恰好是对 std::ostream 的引用。

0
返回 ostream 引用的目的是为了可以将它们链接在一起。否则,你需要这样写:cout << 1; cout << " is a number"; cout << endl。

0

这不是正确的。只有在iostreams的上下文中才是正确的,在我可能不相关和无趣的意见中,iostreams永远不应该以那种形式被放出来。如果您的代码中不包括iostreams,您可以随心所欲地做任何事情。但是我不会重载这些运算符来做除了通过整数值或者可能通过某种方式将类减少为整数值的类之外的任何事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接