C ++入門書の5番目の注意事項(第14章オーバーロード操作と型変換)入力および出力演算子

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;
}

注意:

  • ストリームに間違ったタイプのデータが含まれていると、読み取り操作が失敗し、他の後続の使用が失敗する可能性があります
  • 読み取り操作がファイルの終わりに達するか、入力ストリームで他のエラーが発生すると、それも失敗します
  • 読み取り操作でエラーが発生した場合、入力オペレーターはエラーからの回復を担当する必要があります。

おすすめ

転載: blog.csdn.net/thefist11cc/article/details/113927916