var << ifstream
和ifstream >> var
是一样的吗?
据我所知,它们应该完全相同。但现在已经很晚了,我的大脑有些迷糊,所以我想要一个澄清。
foo << bar
是 foo.operator<<(bar)
或 operator<<(foo, bar)
,而 bar >> foo
是 bar.operator>>(foo)
或 operator>>(bar, foo)
。T
定义以下两个自由函数,没有其他函数被定义:std::ostream & operator<<(std::ostream &, T const &); // for "os << x"
std::istream & operator>>(std::istream &, T &); // for "is >> y"
operator >>
,另一个调用operator <<
。此外,这两个函数的参数也不同。这就像问F(int,double)
是否与调用Q(double, int)
相同,也许是,也许不是,尽管我可以理解为什么对于新手来说这并不立即显而易见。您首先需要意识到重载运算符并没有什么特别之处,它们只是函数调用。除非var
定义了<<
运算符或者它被定义为自由函数,否则前者是无效的。
这里有一个小提示,显示出两个表达式不相同。操作符也可以通过非常丑陋的语法调用。自己看看:
var << ifstream;
等于
var.operator<<(ifstream);
和
ifstream >> var;
等于
ifstream.operator>>(var);
编辑:在下面的评论提醒后,还有第三种选择。operator>> 也可以被实现为一个函数:
returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);
由于签名不匹配,它们可能会被实现得不同。
马蒂亚斯。
operator << (var, ifstream)
和operator >> (ifstream, var)
。 - Edward Strange<<
>>
运算符的左侧,要读取/写入的值位于右侧。这样做有很好的理由:这些运算符可以像链条一样链接起来。std::cout << "Hello" << ',' << " world";
istream
也是类似的)这里发生了什么: <<
运算符是左结合的,所以我们有((std::cout << "Hello") << ',') << " world";
类型在哪里
std::cout : std::ostream
(std::cout << "Hello") : std::ostream
((std::cout << "Hello") << ',') : std::ostream
operator<<(stream, value)
时,都会得到期望的结果。现在你想要的是完全颠倒过来,就像这样" world" >> ',' >> "Hello" >> std::cout;
一开始看起来应该做同样的事情。但它不会,因为这现在解析为
((" world" >> ',') >> "Hello") >> std::cout;
你从一个 operator>>(const char*, char)
开始。现在这个操作符怎么知道最终的结果会被放入一个 std::ostream
中呢?
ifstream
的文档 就可以发现只定义了 operator>>
。operator <<
。只是这不是大多数人使用的标准预期方法。 - Edward Strange