2017-05-03 9 views
0

// using namespace std;ここなぜ直列化のためにメンバー関数のostreamオブジェクトへの参照を返す

これは「(シリアライズ」)抽象クラスから派生し(PComplex、複素数)」を表すクラスのメンバ関数である

ostream& write(ostream& os) const { 
    os << getRe() << "j " << getIm(); 
    return os; 
} 

次のコード純粋の(実装の仮想関数)。私たちは、なぜ無効ではない?のostreamオブジェクトへの参照を返す必要がない理由

私の主な質問はありますか?

答えて

1

ostream&オブジェクトを返すには、togeather事業者の束チェーンに私たちをことができます。

は、これは実際ostream& operator<<(ostream& os, const char* c)を2回呼び出している

cout << "Hello " << "World"; 

この文を考えてみましょう。我々は、実行の順序を考えると、我々が得る:

(cout << "Hello ") << "World"; 

この関数は、右に左と"Hello "coutを受け入れます。右手側の内容をコンソールに出力します。それからcoutを返します。今、私たちは離れてブラケットを取り、取得

(cout) << "World"; 

cout << "World; 

この1に対処する方がはるかに簡単です私たちは、私たちがこれを取得する最初のステップの後に残っているものを検討してください。今度は関数を再び "World"を出力するようにコールし、再び出力を返します。これは単に何もしません。


我々はvoid代わりのostream&を返された場合は、(cout << "Hello ")(void)に減少するであろう。それで私たちは次のようになります:

(void) << "World"; 

これはオーバーロードに一致しないため、エラーが発生します。 (cout << "Hello ")はまだ動作しますが、同じ行に<< "World"をチェーンすることはできません。

関連する問題