【问题标题】:What does "<<" and ">>" mean in C++ for cout/cin?cout/cin 在 C++ 中的“<<”和“>>”是什么意思?
【发布时间】:2011-12-07 02:55:26
【问题描述】:

请原谅我可能提出了一个相当简单的问题,但是插入运算符在程序中的实际含义和作用是什么? (例如cout &lt;&lt; / cin &gt;&gt;

【问题讨论】:

    标签: c++


    【解决方案1】:

    这取决于你如何为你的班级重载它。

    • std::cout 的情况下,&lt;&lt; 用于写入标准输出。 &gt;&gt; 没有为 std::cout 重载。所以std::cout &gt;&gt; x 会报编译错误。

    • 如果是std::cin&gt;&gt; 用于从标准输入读取。 &lt;&lt; 没有为 std::cin 重载。所以std::cin &lt;&lt; x 会报编译错误。

    • 对于您的自定义类,您可以重载&lt;&lt;&gt;&gt;,或者两者都重载,并且在函数中您可以做任何您喜欢的事情。例如,在下面的代码中,我为std::vector&lt;T&gt;重载了&lt;&lt;,为vector添加元素,

      template<typename T>
      std::vector<T> & operator<<(std::vector<T> & v, T const & item)
      {
            v.push_back(item);
            return v;
      }
      

      现在我可以使用这个重载来写这个:

      std::vector<int> v;
      v << 1 << 2 << 3 << 4 << 5; //inserts all integers to the vector!
      

      所有整数都被添加到向量中!见在线演示:http://ideone.com/TsqtS

      同样,我们可以重载&gt;&gt;std::vector&lt;T&gt; 以将其中的所有项目打印为:

      template<typename T>
      std::vector<T> & operator>>(std::vector<T> & v, std::ostream & out)
      {
         for(size_t i = 0 ; i < v.size(); i++ )
            std::cout << v[i] << std::endl;
         return v;
      }
      

      现在我们可以将向量打印为:

      v >> std::cout; //crazy!
      

      在线演示:http://ideone.com/BVSm7

    关键是您可以以任何您想要的方式重载这些运算符。过载和它们的使用看起来有多疯狂或理智取决于你。例如,语法v &gt;&gt; std::cout 对大多数程序员来说看起来很疯狂,我猜。 std::ostream 的更好且可能是理智的重载为:

    template<typename T>
    std::ostream & operator << (std::ostream & out, const std::vector<T> & v)
    {
          for(size_t i = 0 ; i < v.size(); i++ )
             out << v[i] << std::endl;
          return out;
    }
    

    现在你可以这样写了:

    std::cout << v << std::endl; //looks sane!
    

    演示:http://ideone.com/jce2R

    【讨论】:

    • 运算符重载的名声已经够糟糕了。让我们不要鼓励它的滥用。它在流式传输中的使用已经得到很好的证实,上述内容只会让维护者感到困惑(因为它与正常情况相差甚远)。
    • @LokiAstari:这是怎么滥用的?任何熟悉其流式传输用法的人都应该了解上述代码的作用。大多数 Qt 容器都以这种方式工作,我经常使用它,因为它使代码更易于维护和阅读。
    • @LokiAstari:我知道。这就是我在帖子中解释的内容,有各种重载。
    • 好像所有的演示都不再工作了。
    【解决方案2】:

    它们是按位移位运算符(&lt;&lt; 是左移,&gt;&gt; 是右移)。它们通常也被重载为流操作符(&lt;&lt; 表示流出,&gt;&gt; 流入)——流类型位于左侧(例如std::ostreamstd::istream),其他类型位于右侧.

    【讨论】:

      【解决方案3】:

      它写入或读取对象;

      std::cout << 5; // writes the integer 5 to the standard output
      
      int x;
      std::cin >> x;  // reads an integer from the standard input
      

      它对所有标准类型都进行了重载。
      大多数人会为自己的用户定义类型覆盖它们。

      注意:运算符的左侧可以是任何流类型(例如 std::fstream 或 std::stringstream),因此它成为对象序列化的通用机制。

      【讨论】:

        【解决方案4】:

        它们经常被重载并用于流。 > 实际上是一个右移运算符。

        【讨论】:

          【解决方案5】:

          > 是简单的运算符,就像 +、-、=、==、+=、/= 等,你会得到练习。这意味着,它取决于您使用它的对象/结构。使用 cout 和 cin 这些是读/写运算符,但您可能会重载运算符以执行完全不同的操作。

          class myclass {
              int x;
              myclass operator << ( int a ) { 
                  x += a;
              }
          }
          

          现在,我并不是说任何人都应该这样做,但是如果您将 myclass 对象与此运算符一起使用,这将导致添加。所以,正如你所看到的:你用“>”做什么取决于操作符是如何重载的。

          【讨论】:

            猜你喜欢
            • 2011-01-16
            • 2021-07-26
            • 1970-01-01
            • 1970-01-01
            • 2012-04-14
            • 1970-01-01
            • 1970-01-01
            • 2015-09-02
            • 2013-03-09
            相关资源
            最近更新 更多