0

Essential C++から: 4.10 iostream 演算子のクラス インスタンスの提供

多くの場合、クラスのオブジェクトの読み取りと書き込みの両方が必要になります。たとえば、trian クラス オブジェクトを表示するには、次のように記述できるようにします。

cout << train << endl;

これをサポートするには、出力演算子のオーバーロードされたインスタンスを提供する必要があります。

ostream& operator<< (ostream &os, const Triangular &rhs)
{
    os << "(" << rhs.beg_pos() << "," << rhs.length() << ")";
    rhs.display(rhs.length(), rhs.beg_pos(), os);
    return os;
}

関数に渡されたものと同じ ostream オブジェクトを返します。これにより、複数の出力演算子を連結できます。どちらのオブジェクトも参照によって渡されます。各出力操作は ostream オブジェクトの内部状態を変更するため、ostream オペランドは const として宣言されません。

なぜ ostream オペランドを const として宣言できないのか、ちょっと混乱しています。出力演算子が次のように宣言されている場合:

const ostream& operator<< (const ostream &os, const Triangular &rhs)

上記の宣言に問題はありますか?

ありがとう

4

3 に答える 3

2

問題は、ostream引数 (またはその逆istream) が定数参照である場合、オペレーターがストリーム オブジェクトを変更できないことです。ストリームへの挿入/抽出はストリームの状態を変更するため、既存のoperator<<ものは非 const 操作です。つまり、次のことを宣言して定義することもできます。

std::ostream const & operator<<( std::ostream const & s, Type const & t );

問題は、定義が実際にはストリームに何も書き込めないことです。

std::ostream const & operator<<( std::ostream const & s, Type const & t ) {
   s << "Hi";     // Error: operator<<( std::ostream&, const char*) requires a
                  //        non-const `std::ostream&`
   return s;      // This is fine
}
于 2012-07-30T00:15:57.587 に答える
1

変数を出力する場合、出力バッファやファイルの書き込み位置など、rhs内部の一部のデータ メンバを変更する必要があります。ostream& ososofstream

osとして宣言すると、constそのような変更は禁止されます。

また、ここに示されているように、osが として宣言されている場合、定数メンバ関数として宣言されているconstものが 1 つもないため、プリミティブ データ型を出力するために使用することはできません。ostream::operator<<()

于 2012-07-30T00:12:23.050 に答える
0

はい、ostream 引数 os は << を呼び出すことによって変更されます。

于 2012-07-30T00:09:54.730 に答える