3

var << ifstream一样的ifstream >> var吗?

据我所知,它们应该完全相同。但是已经很晚了,我的大脑半睡半醒,所以我想澄清一下。

4

6 回答 6

9

他们不一样。foo << barfoo.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"
于 2012-05-06T21:19:40.897 回答
3

不,它们调用完全不同的函数。一个打电话operator >>,另一个打电话operator <<。此外,两者的论点不同。

这类似于询问是否F(int,double)与调用相同Q(double, int)- 也许,也许不是 - 尽管我可以理解为什么这对于语言新手来说不是立即显而易见的。您首先需要意识到重载运算符并没有什么特别之处,它们只是函数调用。

于 2012-05-06T21:19:58.343 回答
2

除非var定义了<<操作符或者定义为自由函数,否则前者是无效的。

于 2012-05-06T21:14:37.357 回答
0

这里有一个小提示,表明两个表达式并不相同。Operatoras 也可以通过非常丑陋的语法来调用。你自己看:

var << ifstream;

等于

var.operator<<(ifstream);

ifstream >> var;

等于

ifstream.operator>>(var);

编辑:在下面的评论提醒之后 - 还有第三种选择。operator>> 也可以实现为一个函数:

returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);

由于签名不匹配,它们的实现方式可能不同。

马蒂亚斯。

于 2012-05-06T21:19:03.017 回答
0

不,这不是一回事。约定是流参数始终位于<< >>运算符的左侧,而要读取/写入的值始终位于右侧。这有一个很好的理由:这些操作符可以像

std::cout << "Hello" << ',' << " world";

(与istreams 类似)这里发生了什么:<<运算符是左结合的,所以我们有

((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

于 2012-05-06T21:32:44.510 回答
-1

所需要做的就是查看文档ifstream并查看仅operator>>定义的内容。

于 2012-05-06T21:19:28.947 回答