2

私は C# と Java のバックグラウンドから C++ に来て、次のような>>&<<演算子を理解しようとしています。

std::cout << "Hello World";

ここで理解できないのは、<<オペレーターの目的です。常に整数5を返す独自の単純な関数を宣言しようとしましたが、C# で行ったように呼び出すことができます。

int x = MyFunction();

それは に変わりますx5、なぜ を使用する必要があるstd::cout<<でしょうか? >>また、との両方が何のためにあるのかを理解するのを手伝ってくれれば、本当に感謝しています<<

これを理解するのを手伝ってくれてありがとう。実際に私の心を開いたのは、 std::cout がオブジェクトであるという事実です:)

4

6 に答える 6

9

あなたはそれを正確に綴りませんでしたが、あなたの混乱はそれがstd::cout関数であると考えていることであり、なぜこのように呼び出さないのか疑問に思っていると思います:

std::cout("Hello World");

まあ、std::cout関数ではありません。このステートメントの機能は ですoperator<<

std::cout << "Hello World";

または、より具体的には、関数はstd::ostream::operator<<(const char*).

理解する必要があるのは、演算子は別の呼び出し構文を持つ関数にすぎないということです。 operator<<のメンバー関数としてオーバーロードされ、std::ostreamstd::coutオブジェクトですstd::ostream。したがって、この:

std::cout << "Hello World";

これを呼び出す別の方法は次のとおりです。

std::cout.operator<<("Hello World");

は二項演算子であることに注意してください。つまりoperator<<、フリー関数として宣言されている場合は 2 つの引数を取り、メンバー関数として宣言されている場合は 1 つの引数を取ります。別の呼び出し構文を使用する場合、左側のオブジェクトが最初の引数で、右側のオブジェクトが 2 番目の引数です。このようにメンバ関数として宣言されている場合は、左側のオブジェクトが呼び出しオブジェクト、右側のオブジェクトが引数になります。

フリー関数として宣言すると、次のようになります。

operator<<(std::cout, "Hello World");

ただし、メンバーまたはフリー関数として宣言されているかどうかにかかわらず、同じ代替呼び出し構文を引き続き使用できます。

于 2012-10-07T19:31:12.943 に答える
2

<<>>Java や C# と同じように、 は左シフト演算子、は右シフト演算子です。

ただし、さらに<<ストリームに値を出力する方法を提供するためにオーバーロードされます。ストリームstd::coutは通常、プログラムが起動された端末を参照し、そのストリームに何かを<<書き込むと、端末に書き込まれます。同様に、ストリームから読み取るためにオーバーロードされます。また、プログラムが起動された端末から読み取る>>ストリームの場合は、オーバーロードされます。std::cin

ユーザー定義型の演算子の動作を定義するため、この種のことは C++ で機能します。Java では、演算子は組み込み型でのみ動作します。およびが独自のクラスのインスタンスである場合、書き込みa + bはエラーになります。C++ では、クラスが適切な operator を定義する場合、これが許可されます。ab+

于 2012-10-07T19:31:04.210 に答える
2

I/O ストリームの場合、<<and>>演算子はオーバーロードされて、ビット シフト以外の意味になります。たとえば、std::ostream::operator<<は多くの型に対してオーバーロードされており、独自の型に対してもオーバーロードを追加できます。例えば:

#include <string>
#include <iostream>

class my_type {
public:
    my_type(const std::string &name) : _name(name) { }
    const std::string &get_name() const { return _name; }
private:
    std::string _name;
};

std::ostream& operator<< (std::ostream& out, const my_type &foo ) {
    return out << foo.get_name();
}

int main() {
    my_type m("foo");
    std::cout << m;   // prints "foo"
    return 0;
}
于 2012-10-07T19:29:17.710 に答える
1

C および C++ では、 << 演算子は「左シフト」を意味します。C++ では、標準テンプレート ライブラリを使用する場合、ストリーミング API を実装するために << および >> 演算子がオーバーロードされます。

オブジェクト std::cout は << 演算子をオーバーロードして、変換関数として使用します (この場合、コンソールに出力される文字列)。

実際にこれ:

int x = myFunction();
std::cout << x;

この:

std::cout << myFunction();

機能的には同じです (一時変数 x の定義を除いて)。

于 2012-10-07T19:34:22.530 に答える
1

一般に、演算子<<>>演算子は同じ意味を持ちます。ただし、指定した場合、それらはそれぞれストリーム書き込みおよび読み取り演算子です。具体的に<<は、書き込みオペレーター (ストリームに向かって指していると考えてください) で>>あり、読み取りオペレーター (ストリームから離れて指していると考えてください) です。

それらは<<and>>演算子をオーバーロードすることによって処理されます。特に、C++ パラダイムは、入力と出力を処理するために、それぞれfor<<>>for ostreams とs にオーバーロードを追加することです。istreamC++ にはToString()、Java や C# のような組み込みのパラダイムがありません。

最後にstd::coutstd::cinとはそれぞれとstd::cerrのインスタンスですostream。これが、とのオーバーロードを取得する理由です。istreamostream<<>>

たとえば、次のコードHello Worldは標準出力ストリームに出力します。

std::cout << "Hello World" << std::endl;

最後に、 std::endl はostream、改行を追加してストリームをフラッシュする特別なものです。

于 2012-10-07T19:28:37.650 に答える
1

私が覚えている限り、c++にはストリームがあります
<< は、ストリームに「データを追加」するために使用される演算子であり、
>> はストリームからデータを抽出するために使用されます。
もちろん、ストリームだけではないクラスでこれを実装できます。

于 2012-10-07T19:29:24.867 に答える