5

以下の例では、<<オペレーターは正確に何をしていますか?ビット演算子ではないと思います。

std::cout << "Mouse down @ " << event.getPos() << std::endl;

ここでコードが何をするかを理解しています。標準出力を使用し、このテキストを送信し、行末を送信します。生のバイナリを除いて、この<<の使用に出くわしたことはありません。

私はC++から始めています。そして、ある種のオペレーターとして、これの説明とそれが何を意味するのかを検索するのは難しいです。誰かが私を啓蒙したり、グーグルで何を探すべきかについての指針を教えてもらえますか?

ありがとうロス

4

6 に答える 6

11

答えは次のとおりです。<<整数型の場合、演算子はデフォルトで左シフトを実行しますが、オーバーロードして必要な処理を実行できます。

文字列をストリームにパイプするためのこの構文は、C++の発明者であるBjarneStroustroupの名を冠した本TheC ++ Programming Languageで最初に実証されました(私は思います) 。個人的には、IOを実行するためにオペレーターを再定義するのはギミックだと思います。見栄えの良いデモコードになりますが、コードを理解しやすくすることにはなりません。技術としての演算子のオーバーロードは、プログラミング言語コミュニティで広く批判されています。


編集:他の誰もこれについてまだ言及していないので:

operator<<は、インスタンスostreamであるクラスで定義されます。coutクラス定義はiostreamライブラリにあります。これは#include'dとして<iostream>です。

于 2010-07-24T14:54:44.133 に答える
3

operator<<が過負荷になっています。演算子のオーバーロードを確認してください。

于 2010-07-24T14:51:28.397 に答える
3

これは「ストリーム挿入演算子」と呼ばれることもあり、これが最も一般的な使用法です。データをストリームに挿入するためです。ただし、シリアル化などを行うときに、他のオブジェクトにデータを挿入するためにオーバーロードされることがあります。

于 2010-07-24T14:51:36.083 に答える
3

C ++の他の演算子と同様に、<<は演算を実行しています。オーバーロードを使用して、ostreamの左オペランド(std :: coutはostreamタイプ)を使用して、さまざまなタイプのデータを出力するためのストリーム演算子として使用されます。たとえば、次のことができます

int x = 10;
std::string y = " something";
std::cout << x << y << std::endl;

これは「10何か」を出力します。

このコンテキストでは、@は何にも置き換えられません。operator<<は結果をダンプするだけです。

std :: endlは行末であるだけでなく、結果を出力デバイスにフラッシュします。

于 2010-07-24T14:58:48.257 に答える
1

オブジェクトを作成し、オーバーロードされた<<演算子を呼び出すプログラムを作成してみてください。

class x {
    //declare some pvt variables
    //overload << operator
};

int main() {
    x obj;
    cout << obj;
}

そうすることで、次のステートメントを使用する背後にある理論的根拠を理解できます

cout << string_var << int_var;

'string'および'int'は、trueでなくても、<<演算子をオーバーロードしたクラスと見なすことができます。

于 2010-07-24T16:00:58.123 に答える
-4

これは「ビット単位の左シフト」演算子です。

n << p

n個の左p位置のビットをシフトします。ゼロビットは下位位置にシフトされます。3<<2は12です。

質問のコンテキストでは、現在の出力ストリームである「 cout 」に何かをプッシュします。

于 2010-07-24T14:51:19.287 に答える