var << ifstream
与ifstream >> var
相同吗?
据我所知,它们应该完全相同。但现在已经很晚了,我的大脑已经半睡半醒了,所以我想澄清一下。
答案 0 :(得分:9)
他们不一样。 foo << bar
为foo.operator<<(bar)
或operator<<(foo, bar)
,而bar >> foo
为bar.operator>>(foo)
或operator>>(bar, foo)
。
他们只是不同的事情。无论是否存在这些版本,更不用说是否存在两个版本它们做同样的事情,完全取决于代码中的内容。
对于标准的iostream,通常只为以下两个用户定义的类型T
定义了以下两个自由函数,而没有其他函数:
std::ostream & operator<<(std::ostream &, T const &); // for "os << x"
std::istream & operator>>(std::istream &, T &); // for "is >> y"
答案 1 :(得分:3)
没有。他们称完全不同的功能。一个调用operator >>
,另一个调用operator <<
。此外,两者的论点不同。
这类似于询问F(int,double)
是否与调用Q(double, int)
相同 - 也许,也许不是 - 尽管我可以看到为什么对于该语言的新手来说这不是立即显而易见的。首先需要意识到重载的运算符并不特别,它们只是函数调用。
答案 2 :(得分:2)
除非var
定义<<
运算符或将其定义为自由函数,否则前者无效。
答案 3 :(得分:0)
这里有一个小提示,显示两个表达式都不一样。 Operatoras也可以通过非常丑陋的语法调用。亲眼看看:
var << ifstream;
等于
var.operator<<(ifstream);
和
ifstream >> var;
等于
ifstream.operator>>(var);
编辑:在通过以下评论提醒之后 - 还有第三种选择。运营商GT;&GT;也可以实现为函数:
returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);
由于签名不匹配,因此可能会以不同方式实施。
马提亚。
答案 4 :(得分:0)
不,这不是一回事。惯例是,stream参数始终位于<<
>>
运算符的左侧,并且值要读取/写入右侧。并且有一个很好的理由:这些运算符可以像
std::cout << "Hello" << ',' << " world";
(它类似于istream
s)这里发生了什么:<<
运算符是左关联的,所以我们有
((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
?
答案 5 :(得分:-1)
所有必要的是查看the documentation for ifstream
并查看仅定义了operator>>
。