我一直认为cout和cin调用是这样的:
cout << someVar
告诉编译器我们将someVar的值转储到cout中,就像我们可以将水转储到物理流中一样。同样地,
cin >> someVar
告诉编译器使用来自cin的数据(空白之前的所有内容)填充someVar,就像我们可能用物理流中的水填充桶一样。
但是&lt;&lt;和&gt;&gt;是按位运算符。 &LT;&LT;将位移到左边,而&gt;&gt;将位移到右侧。为什么不说,cout << Hello World
和cout << My name is John
让控制台不说“Hello World”?
编辑:这不是“操作员重载”的重复,因为虽然该问题可能隐含地解决了&lt;&lt;和&gt;&gt;运营商,我目前提出的问题并没有解决超载问题。
答案 0 :(得分:4)
在C ++中,您可以重载运算符。此处>>
和<<
是此类重载运算符,在本例中为std::basic_ostream
(std::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
修改此问题可能与此问题重复:
答案 4 :(得分:0)
因此<<
和>>
是右上下文中的按位运算符,但它们在不同的上下文中成为流运算符。就像你可以重载一个函数来接受不同的参数,并根据这些不同的参数表现不同,这些运算符可以(并且已经)在特定的上下文中被覆盖。
流插入意味着将某些东西放入字符串(如cout << "Hello";
),在这种情况下,左操作数是一个流,右操作数,一个字符串,当我们告诉它“转储”时,它知道该怎么做“如你所说,进入溪流。
流提取(>>
)是另一个上下文,其中典型的按位运算符具有完全不同的含义。如果左操作数支持此提取(流),并且提取的值与右操作数的类型匹配,那么我们将执行流操作而不是位移。
答案 5 :(得分:0)
<<
和>>
是C ++中的运算符。在原始类型上,它们按位移位,但它们可以作为成员函数重载或取任何两个参数。从本质上讲,它只是一种调用重载T operator<< (...)
函数的简单方法。
以下是为std::istream
和std::ostream
提供的库重载。
http://www.cplusplus.com/reference/ostream/ostream/operator%3C%3C/ http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/
您可以重载以将用户定义的类型作为参数。