2010-11-01 147 views
3

我只是做了我的编程类测验并得到这个问题的错误:>><<和运算符重载

的功能来 返回类型重载运营商<<必须是 参考的ostream对象。

这对我来说看起来不太合适。当然C++比这个更开放。但我想我会在这里问。这是对的(或错误的)?我的C++知识开始真正褪色,当涉及到运算符超载。

+2

对我来说,这听起来像是一个措辞严厉的问题,老师显然意味着它在流操作符的背景下,但没有明确说明。运算符超载没有强制执行这样的约束,因此你的回答是正确的,我鼓励你通知他们他们的愚蠢:) – radman 2010-11-01 05:00:07

+0

@radman我已经通过电子邮件发送了我的老师关于这个问题并且现在等待回复 – Earlz 2010-11-01 05:05:53

回答

15

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); 

要有点进一步扩大这一点,原来使用的0123的运营商是为了位移。例如,1 << 8是256。 C++为此添加了一个(稍微混淆的)第二次使用,并且在ostream上重载了它以表示“输出”到流中。在一个重载的操作符中你可以做任何你喜欢的操作 - 它就像一个函数一样工作,然而,操作符会附带一个人的期望:程序员期望在C++中,<<是位移或流输出。

+0

这个我想是什么测验是暗示,但措词含糊不清。 – Earlz 2010-11-01 04:41:33

0

使其返回ostream引用的目的是让您可以将它们链接在一起。否则,您必须编写cout << 1; cout << " is a number"; cout << endl

2

具有返回类型作为refernce作为参考参数传递给重载插入运算符在相同的流对象,使我们能够编写代码,如

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

mystream << myobject << fundamental_type_object; 
1

从视图的更一般点,operator<<应该总是返回它的左侧操作数以连锁呼叫,就像operator=

当处理<iostreams>库时,这恰好是对std::ostream的引用。

0

这是不对的。这只是在iostreams的背景下才是正确的,在我的可能不相关的和无趣的意见,应该永远不会以这种形式出笼。如果你不在你的代码中包含iostream,你可以做你喜欢的。但我不会重载这些运算符,除了移位类以外,不管是什么意思,通过整数值,或者可以通过某种可以简化为整数值的类。

2

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

要说'必须'是不正确的,可能'通常'是正确的词,为什么?因为大部分的答案已经指出,它提供了object chaining的便利,同时使用iostreams