什么是“<<”和“>>” c ++ / cin的C ++意味着什么?

时间:2011-10-13 16:28:12

标签: c++

原谅我可能会提出一个相当简单的问题,但插入运算符在程序中实际意味着什么呢? (例如cout << / cin >>

5 个答案:

答案 0 :(得分:14)

这取决于你如何为你的课程重载。

  • 如果是std::cout<<用于写入标准输出。 >>没有超载std::cout。因此std::cout >> x会出现编译错误。

  • 如果是std::cin>>用于从标准输入中读取。 <<没有超载std::cin。因此std::cin << x会出现编译错误。

  • 对于您的自定义类,您可以重载<<>>或两者,并在该函数中可以执行任何您喜欢的操作。例如,在以下代码中,我为<<重载std::vector<T>以向向量添加元素,

    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

    同样,我们可以为>>重载std::vector<T>以打印其中的所有项目:

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

答案 1 :(得分:2)

它们是按位移位运算符(<<向左移位,>>向右移位)。它们也常常被重载为流媒体运营商(<<然后意味着流出,>>流入) - 左侧有流类型(例如std::ostreamstd::istream)以及右侧的任何其他类型。

答案 2 :(得分:1)

写入或读取对象;

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),因此它成为对象序列化的通用机制。

答案 3 :(得分:1)

&LT;&LT;和&gt;&gt;是简单的运算符,就像+, - ,=,==,+ =,/ =等,你得到了演练。这意味着,它取决于您使用它的对象/结构。使用cout和cin这些是读/写操作符,但是你可能会使操作符超载以完成不同的操作。

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

现在,我没有说任何人都应该这样做,但如果你将myclass对象与此运算符一起使用,这将导致添加。所以,你可以看到:你用“&lt;&lt;”做什么或“&gt;&gt;”取决于运算符的过载方式。

答案 4 :(得分:0)

它们经常被重载并用于流。 &LT;&LT;实际上是一个左移算子。 &GT;&GT;实际上是一个右移操作员。