是var << ifstream
一样的ifstream >> var
吗?
据我所知,它们应该完全相同。但是已经很晚了,我的大脑半睡半醒,所以我想澄清一下。
是var << ifstream
一样的ifstream >> var
吗?
据我所知,它们应该完全相同。但是已经很晚了,我的大脑半睡半醒,所以我想澄清一下。
他们不一样。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"
不,它们调用完全不同的函数。一个打电话operator >>
,另一个打电话operator <<
。此外,两者的论点不同。
这类似于询问是否F(int,double)
与调用相同Q(double, int)
- 也许,也许不是 - 尽管我可以理解为什么这对于语言新手来说不是立即显而易见的。您首先需要意识到重载运算符并没有什么特别之处,它们只是函数调用。
除非var
定义了<<
操作符或者定义为自由函数,否则前者是无效的。
这里有一个小提示,表明两个表达式并不相同。Operatoras 也可以通过非常丑陋的语法来调用。你自己看:
var << ifstream;
等于
var.operator<<(ifstream);
和
ifstream >> var;
等于
ifstream.operator>>(var);
编辑:在下面的评论提醒之后 - 还有第三种选择。operator>> 也可以实现为一个函数:
returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);
由于签名不匹配,它们的实现方式可能不同。
马蒂亚斯。
不,这不是一回事。约定是流参数始终位于<<
>>
运算符的左侧,而要读取/写入的值始终位于右侧。这有一个很好的理由:这些操作符可以像
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)
调用 a 时都会得到所需的结果。现在你想要的是扭转整个事情,比如
" world" >> ',' >> "Hello" >> std::cout;
乍一看,它似乎应该做同样的事情。但它没有,因为这现在解析为
((" world" >> ',') >> "Hello") >> std::cout;
你从哪里开始operator>>(const char*, char)
。现在这个运算符如何知道结果最终会被放入一个std::ostream
?
所需要做的就是查看文档ifstream
并查看仅operator>>
定义的内容。