1

演算子のオーバーロードを学習しています。「<<」演算子をオーバーロードするときに、「cout」の代わりに「out」が使用されています。理由がわかりません。

  ostream &operator<<( ostream &out, const IntList &L ) {
    out << "[ ";
    for (int k=0; k< L.numItems; k++) {
    out << L.Items[k] << ' ';
    }
   out << ']';
}

cout と out の違いと、out の代わりに cout を使用するとどうなるかを知りたいです。回答ありがとうございます。

4

4 に答える 4

14

あなたが見ているのは、オーバーロードされた「ストリーム挿入」演算子であり、典型的な構文ostreamを使用してカスタムクラスをオブジェクトに書き込むことができます。cout << myObject

この場合の変数は、関数に渡されるオブジェクトにout付けられた名前であるため、呼び出されます。これは、または またはのいずれかの出力ストリームである可能性があります。それは単なる変数名であり、彼らはそれを呼び出して次のように書いた可能性があります:ostreamcoutfstreamstringstreamblah

ostream &operator<<( ostream &blah, const IntList &L ) {
   blah << "[ ";
   // ...
}

通常、わかりやすい変数名を選択しますout。出力ストリームの名前はかなりわかりやすいものです。

coutは、特に標準出力ストリームへの書き込みに使用されると強く関連付けられているため、特に悪い変数名です。std::coutこのコードは、特に標準出力に書き込むのではなく、演算子を介して任意の ostreamオブジェクトに書き込むため、引数にはより一般的な名前が選択されています。<<ostream

于 2012-10-18T15:58:21.753 に答える
2

cout と out の違いと、out の代わりに cout を使用するとどうなるかを知りたいです。回答ありがとうございます。

この場合、ostream&( out) は関数に渡されるパラメーターです。これにより、は任意のoperator<<で機能します ostream

cout特定の インスタンスostream- 標準出力ストリームです。ここで使用した場合、演算子 on (標準エラー ストリーム) やその他のcoutを使用できなくなります。本体でをに置き換えた場合、別の ostream でこれを使用するたびに、 に書き込まれます。(もちろん、パラメーターを名前付きに変更した場合、それは起こりません。しかし、コードがストリームではなく標準出力ストリームに書き込むと人々が期待するため、このコードを見ている人には非常に誤解を招くでしょう。渡されます。) <<cerrostreamoutcoutcoutcout

一般に、標準出力ストリームcoutを特に参照している場合にのみ、名前として使用std::coutする必要があります。他のコンテキストで使用すると非常に混乱するためです。

于 2012-10-18T16:00:18.103 に答える
1

out は、オーバーロードされたオペレーター (オペレーターの実装内) に渡される ostream オブジェクトの名前です。

オーバーロードされた演算子を使用すると、次のようなコードを記述できます

IntList i;
cout<<i;

また

cerr<<i;

実装で、 outcoutに置き換えた場合、2 番目の呼び出し

cerr<<i;

標準出力に出力されますが、標準エラーに出力されるはずです。

于 2012-10-18T16:02:23.843 に答える
0

ここで重要なことは、実際には関数シグネチャの型です。それが 2 つのパラメーターを持つ独立した関数である限り、1 つは型のパラメーターでstd::ostream&あり、もう 1 つはストリーミングされる値と一致できるものである限り、関数本体が呼び出されます。チェーンを許可するには、ストリームへの参照を返す必要があります ( のようにif (cout << firstIntList << secondIntList))。

実際のパラメーター名は、予約語でない限り、自由に設定できます。出力ストリームのように、「os」を使用する傾向があります。

于 2012-10-18T16:07:17.653 に答える