1.一般的な説明
入力演算子と出力演算子は非メンバー関数である必要があります。そうでない場合、左側のオペランドは、次のコードのように、クラスのオブジェクトになります。
Sales_data data;
data << cout;
- IO操作は通常、クラスの非公開データの読み取りと書き込みを行う必要があるため、入力演算子と出力演算子は通常、フレンドとして宣言されます。
- 入力演算子は、入力が失敗する可能性がある状況を処理する必要がありますが、出力演算子は失敗しません。
2.出力演算子<<
パラメータの説明:
- 最初のパラメーターは通常、非定数のostreamオブジェクトへの参照です。その理由は、ストリームへの書き込みによってその状態が変更されるためです。参照は、ostreamオブジェクトをコピーできないためです。
- 2番目のパラメーターは、印刷されるタイプの定数参照です。
- 戻り値はそのostreamパラメーターです。
例えば。
ostream &operator<<(ostream &os,const Sales_data &item)
{
os<<item.isbn()<<" "<<item.units_sold<<""
<<item.revenue<<" "<<item.avg_price();
return os;
}
注:出力演算子は、フォーマットを制御するのではなく、主にオブジェクトのコンテンツの印刷を担当する必要があります。出力演算子は、改行文字を印刷しないでください。
3.入力演算子>>
パラメータの説明:
- 最初のパラメーターは通常、オペレーターが読み取るストリームへの参照です。
- 2番目のパラメーターは、読み取られる(非定数)オブジェクトへの参照です。
- 戻り値はそのistreamパラメーターです。
例えば。
istream &opertaor>>(istream &is,Sales_data &item)
{
double price;// 不需要初始化,因为我们将先读入数据到`price`,之后才使用它
is>>item.bookNo>>iten.units_sold>>price;
//检查输入是否成功
if(is)
{
item.revenue=item.units_sold*price;
}else{
item=Sales_data(); //输入失败:对象呗赋予默认的状态
}
return is;
}
注意:
- ストリームに間違ったタイプのデータが含まれていると、読み取り操作が失敗し、他の後続の使用が失敗する可能性があります
- 読み取り操作がファイルの終わりに達するか、入力ストリームで他のエラーが発生すると、それも失敗します
- 読み取り操作でエラーが発生した場合、入力オペレーターはエラーからの回復を担当する必要があります。