C++ 在C++;,is`var<&书信电报;ifstream`与ifstream>;相同&燃气轮机;变量`?

C++ 在C++;,is`var<&书信电报;ifstream`与ifstream>;相同&燃气轮机;变量`?,c++,ifstream,extraction,insertion,C++,Ifstream,Extraction,Insertion,是var>var 据我所知,它们应该完全一样。但是已经很晚了,我的大脑处于半睡眠状态,所以我想澄清一下。除非var定义了这里有一个小提示,表明这两个表达式是不一样的。运算符也可以通过非常难看的语法调用。你自己看看: var << ifstream; 相等于 var.operator<<(ifstream); ifstream.operator>>(var); 编辑:在被下面的评论提醒之后,还有第三个选择。操作员>>也可以作为一项功能来实现: return

var>var


据我所知,它们应该完全一样。但是已经很晚了,我的大脑处于半睡眠状态,所以我想澄清一下。

除非
var
定义了
这里有一个小提示,表明这两个表达式是不一样的。运算符也可以通过非常难看的语法调用。你自己看看:

var << ifstream;
相等于

var.operator<<(ifstream);
ifstream.operator>>(var);
编辑:在被下面的评论提醒之后,还有第三个选择。操作员>>也可以作为一项功能来实现:

returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);
由于签名不匹配,因此它们的实现方式可能不同


matthias.

所有必要的是查看并确定只定义了
操作符>

它们是不同的<代码>foo>(条形图,foo)

它们只是不同的东西。这些版本是否存在,更不用说如果存在两个版本,它们做的事情是否相同,完全取决于代码中的内容

对于标准iostreams,通常仅为某些用户定义的类型
T
定义以下两个自由函数,而不定义其他函数:

std::ostream & operator<<(std::ostream &, T const &);  // for "os << x"
std::istream & operator>>(std::istream &, T &);        // for "is >> y"
std::ostream&运算符(std::istream&,T&);//对于“is>>y”

不。它们调用完全不同的函数。一个呼叫
操作员>>
,另一个呼叫
操作员不,这不是一回事。按照惯例,stream参数始终位于
运算符的左侧,而要读取/写入的值则位于右侧。这有一个很好的理由:这些操作符可以像

std::cout << "Hello" << ',' << " world";
类型在哪里

std::cout                         :   std::ostream
(std::cout << "Hello")            :   std::ostream
((std::cout << "Hello") << ',')   :   std::ostream
乍一看,它应该做同样的事情。但事实并非如此,因为这现在决定

((" world" >> ',') >> "Hello") >> std::cout;

其中,从一个
操作符>>(const char*,char)
开始。现在,这个操作员怎么知道结果最终会被放入一个
std::ostream

同样,谷歌在这方面做得很糟糕。我真的希望他们能允许搜索符号。检查,它对SO特别有效。它不必由var类定义。它可以是一个自由函数。没有理由不能定义
operator@CrazyEddie,当然你可以定义你想要的任何东西。我认为这个问题的意思是,它们都是开箱即用的吗?答案是否定的。不幸的是,你的答案也意味着你只需要查看ifstream的文档就可以知道答案,这是一个相当误导的说法……让人有点怀疑。这也意味着在cplusplus.com上查看条目等同于查看文档。@BenjaminLindley,如果你知道更好的在线文档,我很乐意听。这只是为了表明我不应该在累了的时候编写代码。现在完全有道理了。谢谢:)没问题。记住C++中的运算符可以在整个地方过载,这是个好主意。有时在非常意外的情况下会出现这种情况(例如,当前标准中存在错误使用逗号运算符的缺陷)。但重载运算符只是函数调用,没有什么神奇之处。不一定,它们也可以是
operator>(ifstream,var)
std::cout                         :   std::ostream
(std::cout << "Hello")            :   std::ostream
((std::cout << "Hello") << ',')   :   std::ostream
" world" >> ',' >> "Hello" >> std::cout;
((" world" >> ',') >> "Hello") >> std::cout;