究竟怎么做<<和>>,在流中使用,工作?

时间:2016-02-25 19:31:28

标签: c++

我一直认为cout和cin调用是这样的:

cout << someVar

告诉编译器我们将someVar的值转储到cout中,就像我们可以将水转储到物理流中一样。同样地,

cin >> someVar

告诉编译器使用来自cin的数据(空白之前的所有内容)填充someVar,就像我们可能用物理流中的水填充桶一样。

但是&lt;&lt;和&gt;&gt;是按位运算符。 &LT;&LT;将位移到左边,而&gt;&gt;将位移到右侧。为什么不说,cout << Hello Worldcout << My name is John让控制台不说“Hello World”?

编辑:这不是“操作员重载”的重复,因为虽然该问题可能隐含地解决了&lt;&lt;和&gt;&gt;运营商,我目前提出的问题并没有解决超载问题。

6 个答案:

答案 0 :(得分:4)

在C ++中,您可以重载运算符。此处>><<是此类重载运算符,在本例中为std::basic_ostreamstd::basic_istream)的成员,格式为

std::basic_ostream& operator<<(int); // overload for int

所以当你写

std::cout << 42;

电话转换为

std::cout.operator<<(42);

请注意,operator<<operator>>也可以定义为非成员函数,在这种情况下,它们的表单类似于:

std::basic_ostream& operator<<(std::basic_ostream& os, const Foo& foo)

其中Foo是某种自定义类型。这是您在一般流提取和插入中实现的方式,重载非成员operator<<operator>>,因为您无权访问std::basic_ostream或{{1}的内部}。

参见例如this了解更多详情。

答案 1 :(得分:2)

请记住,在C ++中,它们不是字位移位运算符,它们只是运算符。您可以将它们定义为您想要的任何内容,并在流的上下文中执行输入和输出操作。

不要太忙于“告诉编译器”的东西。这并不意味着什么。而是在代码中考虑“被定义为”。标准库并没有什么神奇之处,它只是像您自己编写的C ++代码一样。编译器负责将其解析为机器代码。

您可以在已定义的类上编写自己的<<运算符,例如,将数据添加到数组中,或者为以特定方式处理事物的输出流创建特殊版本。这完全取决于你。

答案 2 :(得分:0)

<<是一名运营商。在C ++中,您可以overload operators在不同类型上执行不同的操作。

编译器能够确定正在操作的类型并以不同方式执行代码。因此,对于流,它会将数据发送到需要的位置并进行适当处理。

答案 3 :(得分:0)

对于&lt;&lt;的默认用法和&gt;&gt;:

C++ : Whats does this sign “<<” do?

&LT;&LT;和&gt;&gt;也可以超载:

http://en.cppreference.com/w/cpp/language/operators

修改此问题可能与此问题重复:

How does the << Operator exactly work?

答案 4 :(得分:0)

因此<<>>是右上下文中的按位运算符,但它们在不同的上下文中成为流运算符。就像你可以重载一个函数来接受不同的参数,并根据这些不同的参数表现不同,这些运算符可以(并且已经)在特定的上下文中被覆盖。

流插入意味着将某些东西放入字符串(如cout << "Hello";),在这种情况下,左操作数是一个流,右操作数,一个字符串,当我们告诉它“转储”时,它知道该怎么做“如你所说,进入溪流。

流提取(>>)是另一个上下文,其中典型的按位运算符具有完全不同的含义。如果左操作数支持此提取(流),并且提取的值与右操作数的类型匹配,那么我们将执行流操作而不是位移。

答案 5 :(得分:0)

<<>>是C ++中的运算符。在原始类型上,它们按位移位,但它们可以作为成员函数重载或取任何两个参数。从本质上讲,它只是一种调用重载T operator<< (...)函数的简单方法。

以下是为std::istreamstd::ostream提供的库重载。

http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

您可以重载以将用户定义的类型作为参数。

http://www.tutorialspoint.com/cplusplus/cpp_overloading.htm