我正在学习C ++并且从未处理过流。我本来期望这个符号是:
std::cout << "foo";
char foo << std::cin;
我确信这是std::cin >> foo
的一个很好的理由。它是什么?
答案 0 :(得分:39)
它与&lt;&lt;的关联性有关。和&gt;&gt;运算符。
它们最初只适用于位置相关的位移。重载时运算符关联性保持不变(否则,代码将无法解析):
如果你做了
int a, b ;
a << b << cin
你会得到
(a << b) << cin
位移和输入
这就是标准库以它的方式完成的原因。
答案 1 :(得分:13)
a << b
和a >> b
只是简介:
operator<<(a,b)
和
operator>>(a,b)
(或成员函数等价物)。
也就是说,它们只是对特定功能的调用。恰好,C ++标准库重载operator<<
以执行到ostream
的输出流,并operator>>
执行来自istream
的输入流。
这些函数只是重载才能让流在左边。
这个决定有两个原因。第一个是符号简单性(也就是说,因为只有一种方法可以对操作数进行排序,所以对于任何特定代码的含义都没有那么模糊,并且在将标准库扩展到标准库时,不需要实现大量不同的重载。支持额外的课程)。第二个是<<
和>>
是左关联的,所以:
int a, b;
a << b << cin;
会变成:
(a << b) << cin;
,同时:
int a, b;
cin >> b >> a;
正确成为:
(cin >> b) >> a;
答案 2 :(得分:3)
这样你就会被迫把控制台放在左边,就像上帝想要的那样! :)
它实际上与称为运算符重载的东西有关。如果您只是学习C ++,那么您可能还没有涵盖那些文件,我将在“稍后我会得到的东西”中说出来。
C ++生活在C之上。在C <<
中,>>
只是位移操作符。在c ++中它可以更多。 std:cout << foo
不是C,它是C ++。它是C ++的原因是因为std::cout
对象重载<<
运算符以表示除位移之外的其他内容。
换句话说,<<
仅表示将foo
发送到cout
,因为cout
表示这意味着什么。 <<
实际上是类cout
上的函数。
这几乎就像你说std::cout->sendThatToMe(foo)
。
在整个事件中foo
只是一个不幸的参数,对于<<
意味着什么没有发言权。这就是为什么你不能以其他方式做到这一点。如果你这样做就好像你说的那样:
foo->sendMeToThat( std::cout).
如果您将该功能(以及>>
运算符确实)添加到您可能想要发送到控制台的每个发臭对象,可以使其工作。哦,祝你好运,用原始语拉开它。
因此,虽然我认为有很好的风格理由想要将控制台内容保留在左侧,但实际上是技术原因必须是这样。这是因为重载的运算符已经是关联的。自从他们习惯于在旧的C天换位以来,他们一直在使用它们。超载它们并没有提供改变其相关性的机会。
答案 3 :(得分:0)
这就是他们应该工作的方式。我认为这是为了清楚地区分输出操作(&gt;&gt;)和输出操作(&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
如果你以这种奇特的方式重载<<
运算符(正如Captain Obvious在评论中所建议的那样):
template<typename T>
std::istream& operator<<( T& data , std::istream& is )
{
is >> data;
return *this;
}
如果操作输入或输出(std::cin std::cout
简单易行,那么将不太清楚,但有两个名为file1
和file2
的流,一个用于读取,一个用于写入):
a << std::cin;
std::cout << a;
a << file;
file << a;