【问题标题】:>> and << operator overloading>> 和 << 运算符重载
【发布时间】:2016-01-03 08:38:16
【问题描述】:

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

函数的返回类型 重载运算符&lt;&lt; 必须是 引用 ostream 对象。

这对我来说似乎完全不对。当然,C++ 比这更开放一些。但我想我还是会在这里问。这如何正确(或错误)?当涉及到运算符重载时,我的 C++ 知识开始真正消失。

【问题讨论】:

  • 对我来说听起来像是一个措辞不好的问题,老师显然是在流操作符的上下文中表示的,但没有明确说明这一点。运算符重载不会强制执行此类约束,因此您的答案是正确的,我鼓励您通知他们他们的愚蠢:)
  • @radman 我已经通过电子邮件向我的老师发送了这个问题,现在正在等待回复

标签: c++ operator-overloading


【解决方案1】:

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

为了进一步扩展这一点,&lt;&lt; 运算符的原始用途是用于位移。例如,1 &lt;&lt; 8 是 256。 C++ 为此添加了一个(稍微令人困惑的)第二个用途,并在ostream 上重载它以表示“输出”到流。你可以在一个重载的运算符中做任何你喜欢的事情——它就像一个函数一样工作,但是,运算符有一个人类的期望:在 C++ 中,程序员期望 &lt;&lt; 是位移或流输出。

【讨论】:

    【解决方案2】:

    将返回类型作为对作为引用参数传递给重载插入运算符的同一流对象的引用使我们能够编写如下代码

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

    【讨论】:

      【解决方案3】:

      重载运算符&lt;&lt;的函数的返回类型必须是对ostream对象的引用。

      说“必须”是不正确的,可能“通常”是正确的词,为什么?因为正如大多数答案已经指出的那样,它提供了object chaining 的便利,同时与iostreams 一起使用。

      【讨论】:

        【解决方案4】:

        从更一般的角度来看,operator&lt;&lt; 应该始终返回它的左侧操作数以便链接调用,就像 operator= 一样。

        在处理&lt;iostreams&gt; 库时,这恰好是对std::ostream 的引用。

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            这是不对的。它只在 iostreams 的上下文中是正确的,在我可能不相关和无趣的意见中,它永远不应该以这种形式被放出笼子。如果您的代码中不包含 iostreams,您可以随心所欲。但是我不会重载这些运算符来做任何事情,除了移位类,无论这意味着什么,通过整数值,或者可能通过可以以某种方式减少为整数值的类。

            【讨论】:

              猜你喜欢
              • 2016-02-19
              • 2012-11-26
              • 2017-04-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多