2

cplusplus.com から、ostreamクラスのメンバー関数operator<<が次のようになっていることがわかりました。

ostream& operator<< (bool val);   ostream& operator<< (int val);   

.... 等々。

cout<<x 関数をアクティブにするように Cout オブジェクトを使用ostream& operator<< (int val) すると、実際には<<Cout オブジェクトで演算子を使用するため、これは理にかなってい ます。これは他のすべての演算子と非常によく似ており、int変数を関数に送信します。違いは何ですか?また、自分のオブジェクトをストリーミングしたい場合はどうなりますか? 構文が突然 になるのはなぜostream& operator<< (**ostream &os**, object ob)ですか? なぜ変数を追加する必要があるの ostreamですか? 私はまだ使用して cout<<obいるので、なぜそれが正しいの ostream& operator<< (object obj)でしょうか? 私が渡すのは私のオブジェクトだけです。coutオブジェクトはすでにそこにあります。

4

3 に答える 3

2

operator<<一般に自由関数として定義されます。つまり、メンバー関数ではありません。これはオーバーロードされた二項演算子であるため、左の引数が最初に取得され、右の引数が 2 番目に取得されることを意味します。

operator<<慣用的な出力チェーンを有効にするために、伝統的に左引数への参照を返します。

読者にわかりやすくするために、私はとの略語operatorを使用してオーバーロードを定義する傾向があります。anは、一部の type の場合、これに似ています。lhsrhsoperator<<T

std::ostream& operator<<(std::ostream& lhs, T const& rhs)
{
    // TODO: Do something
    return lhs;
}

メンバー関数として

他のバイナリと同様に、メンバー関数として定義できます。つまり、独自の を定義しているとしますiostream。とりわけ、クラス宣言は次のようになります。繰り返しTますが、特定のタイプです。

class MyIOStream : public iostream
{

public:
    MyIOStream& operator<<(T const& rhs);

}

この場合operator<<はメンバー関数です。として使用される場合、同じセマンティクスを持ち<<ます。

参考文献

  1. C および C++ の演算子- オーバーロードできるすべての演算子とその典型的な引数の優れた要約。
于 2013-04-14T19:49:40.583 に答える
1

basic_istream一部のストリーム エクストラクタは;のメンバーです。それらはメンバーであるため、basic_istream引数は暗示されます。一部のストリーム エクストラクタは のメンバーではありませんbasic_istream。これらはメンバーではないため、basic_istream引数は宣言の一部である必要があります。

このように(単純化しすぎています):

class basic_istream {
public:
    basic_istream& operator>>(int& i);
}

basic_istream& operator>>(basic_istream&, std::string& str);

どちらも同じ方法で呼び出すことができます:

int i;
std::cin >> i; // calls basic_istream::operator>>(int&)
std::string str;
std::cin >> str; // calls operator>>(basic_istrea&, std::string&)
于 2013-04-14T19:58:47.823 に答える
1

なぜ ostream var を追加する必要があるのですか?

出力を一緒にチェーンできるように、そこにあると確信しています:

cout << foo << bar

最初の呼び出しはcout << foo、パーツostreamに使用できる参照になります。<< bar

于 2013-04-14T19:51:10.490 に答える