2015-10-30 35 views
5

は、クラスを考えると?演算子<<オーバーロードはどのように機能しますか?</p> <pre><code>struct employee { string name; string ID; string phone; string department; }; </code></pre> <p>次の関数はどのように機能するの:

ostream &operator<<(ostream &s, employee &o) 
{ 
s << o.name << endl; 
s << "Emp#: " << o.ID << endl; 
s << "Dept: " << o.department << endl; 
s << "Phone: " << o.phone << endl; 

return s; 
} 

cout << e;は、所与employee e用にフォーマットされた出力を生成します。

出力例:

Alex Johnson 
Emp#: 5719 
Dept: Repair 
Phone: 555-0174 

私はostreamに機能がどのように機能するかを理解することはできません。パラメータ "ostream &s"はどのように取得されますか? "< <"演算子はどのようにオーバーロードされ、< <演算子はどのように動作しますか?従業員に関するすべての情報を書き込むためにどのように使用できますか?誰かが素人の言葉でこれらの質問に答えることができますか?

+2

オーバーロード演算子は、主に関数呼び出しのためだけ糖衣構文、表現されているπάνταῥεῖで指摘したように、我々は、それを変更しないのでemployeeへの参照は、constのあるべき'cout << * itr'は' operator <<(cout、* itr) 'と同じですが、実際にはこの構文を使うのと全く同じ方法で動作します。 – user657267

+2

あなたは、これらのことを本から学ぶのが賢明です。 –

+1

注釈:出力演算子のオーバーロードのシグネチャは 'ostream&operator <<(ostream&s、const employee&o)'でなければなりません。すべてのゲッター関数も 'const'でなければなりません。' Employeeインスタンス。 –

答えて

8

これは、過負荷解決と呼ばれます。 あなたはcout << *itrと書いてあります。 コンパイラはoperator<<(cout, *itr);とします。ostream*itrが従業員のインスタンスである場合、coutがインスタンスです。 あなたの呼び出しに最もよく一致する関数void operator<<(ostream&, employee&);を定義しました。 だから、それがemployee e;考えるo

1

ためs*itrためcoutを渡して実行されます。 次のコード: cout << e;

はあなたオーバーロードさ関数を呼び出してcouteへの参照を渡します。

ostream &operator<<(ostream &s, const employee &o) 
{ 
    // print the name of the employee e to cout 
    // (for our example parameters) 
    s << o.name << endl; 

    // ... 

    // return the stream itself, so multiple << can be chained 
    return s; 
} 

追記

関連する問題