代码之家  ›  专栏  ›  技术社区  ›  Earlz

>>和<<运算符重载

  •  3
  • Earlz  · 技术社区  · 14 年前

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

    函数的返回类型 使操作者超载 << 对ostream对象的引用。

    我觉得这一点都不对。当然C++比这个更开放一些。但我还是想问一下。这怎么对(或错)?当操作符重载时,我的C++知识开始真正消失。

    6 回复  |  直到 14 年前
        1
  •  16
  •   Thanatos    14 年前

    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++增加了(稍微混淆)第二次使用,并重载了它。 奥斯特莱姆 意思是流的“输出”。你可以在过载的操作员中做任何你喜欢的事情,它就像一个函数一样工作,然而,操作员有一个人类的期望,他们在程序中期望,在C++中, << 是位移位或流输出。

        2
  •  2
  •   Chubsdad    14 年前

    mystream &operator << (mystream &os, myclass &myobject){
       // do whatever
       return os;
    }
    
    mystream << myobject << fundamental_type_object;
    
        3
  •  2
  •   Sibren Heikki Toivonen    9 年前

    重载运算符的函数的返回类型 << 必须是对 ostream

    说“必须”是不正确的,可能“通常”是正确的词,为什么?因为正如大多数答案已经指出的那样,它为 object chaining iostreams .

        4
  •  1
  •   André Caron    14 年前

    从更一般的角度来看, operator<< 应该始终返回它的左手边操作数,以便链接调用,就像 operator= .

    <iostreams> 图书馆,这正好是 std::ostream .

        5
  •  0
  •   Ben Jackson    14 年前

    cout << 1; cout << " is a number"; cout << endl

        6
  •  0
  •   user207421    14 年前

    这是不对的。这只在iostreams的上下文中是正确的,在我看来,这可能是无关紧要的和无趣的,不应该以这种形式被释放出来。如果你的代码中没有iostreams,你可以随心所欲。但是我不会重载这些运算符来做任何事情,除了移位类,不管这意味着什么,通过整数值,或者也许通过类可以以某种方式减少为整数值。