var << ifstream
と同じですかifstream >> var
?
私が知る限り、それらはまったく同じでなければなりません。でももう遅いし、脳が半分眠っているので、説明をお願いします。
var << ifstream
と同じですかifstream >> var
?
私が知る限り、それらはまったく同じでなければなりません。でももう遅いし、脳が半分眠っているので、説明をお願いします。
それらは同じではありません。foo << bar
はfoo.operator<<(bar)
またはですがoperator<<(foo, bar)
、bar >> foo
はbar.operator>>(foo)
またはoperator>>(bar, foo)
です。
それらはただの別物です。これらのバージョンのいずれかが存在するかどうかはもちろん、2 つのバージョンが存在する場合に同じことを行うかどうかは、コードの内容に完全に依存します。
標準の iostream の場合、通常、次の 2 つのフリー関数のみが定義され、他の関数は定義されていませんT
。
std::ostream & operator<<(std::ostream &, T const &); // for "os << x"
std::istream & operator>>(std::istream &, T &); // for "is >> y"
いいえ、それらは完全に異なる関数を呼び出します。1 つは を呼び出しoperator >>
、もう 1 つは を呼び出しますoperator <<
。さらに、両者の主張は異なります。
F(int,double)
これは、呼び出しと同じかどうかを尋ねることに似てQ(double, int)
いますが、おそらく、そうではないかもしれませんが、この言語を初めて使用する人にとって、これがすぐにわからない理由はわかります。オーバーロードされた演算子は特別なものではなく、単なる関数呼び出しであることを最初に認識する必要があります。
var
演算子を定義する<<
か、フリー関数として定義しない限り、前者は無効です。
ここに、両方の式が同じではないことを示すちょっとしたヒントがあります。Operatoras は、非常に醜い構文を介して呼び出すこともできます。自分で見て:
var << ifstream;
等しい
var.operator<<(ifstream);
と
ifstream >> var;
等しい
ifstream.operator>>(var);
編集:以下のコメントで思い出した後、3番目のオプションもあります。operator>> は関数として実装することもできます:
returntype operator>>(ifstream, var);
returntype operator>>(var, ifstream);
署名が一致しないため、異なる方法で実装される可能性があります。
マティアス。
いいえ、同じではありません。規則では、ストリーム引数は常に<<
>>
演算子の左側にあり、値は右側に読み書きされます。これには正当な理由があります。これらの演算子は次のように連鎖できます。
std::cout << "Hello" << ',' << " world";
(s についても同様に機能しistream
ます) ここで何が起こるか:<<
演算子は左結合なので、次のようになります。
((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>>
が定義されていることを確認することだけです。