C++中cout/cin的"<<"和">>"是什么意思?

use*_*962 18 c++

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

Naw*_*waz 16

这取决于你如何为你的课超重.

  • 在用的情况下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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    std::vector<int> v;
    v << 1 << 2 << 3 << 4 << 5; //inserts all integers to the vector!
    
    Run Code Online (Sandbox Code Playgroud)

    所有整数都被添加到向量中!参见在线演示: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;
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    v >> std::cout; //crazy!
    
    Run Code Online (Sandbox Code Playgroud)

    在线演示: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;
}
Run Code Online (Sandbox Code Playgroud)

现在你可以这样写:

std::cout << v << std::endl; //looks sane!
Run Code Online (Sandbox Code Playgroud)

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

  • @LokiAstari:这是怎么滥用的?任何熟悉流媒体用法的人都应该意识到上面代码的作用。大多数 Qt 容器都是这样工作的,我经常使用它,因为它使代码更容易维护和阅读。 (2认同)

Cat*_*lus 5

它们是按位移位运算符(<<左移,>>右移)。它们通常也作为流操作符重载(<<然后意味着流输出,>>流输入)——流类型在左侧(例如std::ostreamor std::istream)和任何其他类型在右侧。


Mar*_*ork 4

它写入或读取对象;

std::cout << 5; // writes the integer 5 to the standard output

int x;
std::cin >> x;  // reads an integer from the standard input
Run Code Online (Sandbox Code Playgroud)

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

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