2011-10-13 21 views

答えて

1

オブジェクトの書き込みまたは読み取りを行います。

std::cout << 5; // writes the integer 5 to the standard output 

int x; 
std::cin >> x; // reads an integer from the standard input 

すべての標準タイプでオーバーロードされます。
ほとんどの人は、独自のユーザー定義型のためにそれらを上書きします。

注:演算子の左側は任意のストリーム型(std :: fstreamやstd :: stringstreamなど)でもかまいません。したがって、オブジェクトのシリアル化の一般的なメカニズムになります。

10

どのようにクラスをオーバーロードするかによって異なります。 std::coutの場合

  • <<は、標準出力への書き込みに使用されます。 std::coutの場合、>>はオーバーロードされません。だからstd::cout >> xはコンパイルエラーを起こすでしょう。

  • std::cinの場合、>>は、標準入力からの読み取りに使用されます。 std::coutの場合、<<はオーバーロードされません。したがって、std::cin << xはコンパイルエラーを起こします。

  • カスタムクラスでは、<<または>>、またはその両方をオーバーロードすることができます。また、この関数では好きなことを行うことができます。たとえば、次のコードでは、私は、ベクターに要素を追加するstd::vector<T>ため<<をオーバーロード、

    template<typename T> 
    std::vector<T> & operator<<(std::vector<T> & v, T const & item) 
    { 
         v.push_back(item); 
         return v; 
    } 
    

    今、私はこれを書くために、このオーバーロードを使用することができます。

    std::vector<int> v; 
    v << 1 << 2 << 3 << 4 << 5; //inserts all integers to the vector! 
    

    すべての整数が追加されますベクター!我々のようにそれにすべての項目を印刷するstd::vector<T>ため>>をオーバーロードすることができ、同様にhttp://ideone.com/TsqtS

    :オンラインデモを参照してください

    template<typename T> 
    std::vector<T> & operator>>(std::vector<T> & v, std::ostream & out) 
    { 
        for(size_t i = 0 ; i < v.size(); i++) 
         std::cout << v[i] << std::endl; 
        return v; 
    } 
    

    そして今、我々はとしてベクトルを印刷することができます。

    v >> std::cout; //crazy! 
    

    オンラインデモ:http://ideone.com/BVSm7

重要な点は、これらの演算子を任意の方法でオーバーロードできることです。過負荷とその使い方がどのように狂っているのか、まともであるかはあなた次第です。たとえば、私が推測するように、構文v >> std::coutはほとんどのプログラマーにとって狂っているように見えます。より良い、おそらくまともな過負荷がstd::ostreamとしてのために次のようになります。

template<typename T> 
std::ostream & operator << (std::ostream & out, const std::vector<T> & v) 
{ 
     for(size_t i = 0 ; i < v.size(); i++) 
     out << v[i] << std::endl; 
     return out; 
} 

は今、あなたがこれを書くことができます。

std::cout << v << std::endl; //looks sane! 

デモ:彼らは多くの場合、過負荷状態とストリームに使用されているhttp://ideone.com/jce2R

+0

演算子のオーバーロードは、評判が十分に悪いです。その虐待を奨励しない。ストリーミングのためのその使用は十分に確立されています、上記はちょうどメンテナを混乱させるでしょう(それは正常からの拍動であるので)。 –

+1

@LokiAstari:この虐待はどうですか?ストリーミングの使用方法に精通している人なら、上記のコードが何をしているのかを理解する必要があります。ほとんどのQtコンテナはそのように動作し、コードの保守や読み込みが容易になるため、多くのQtコンテナが使用されます。 – pezcode

+0

@ LokiAstari:私は知っています。それは私が私のポストで説明しているもので、さまざまな種類のオーバーロードがあります。 – Nawaz

0

。 < <は実際にはレフトシフト演算子です。 >>実際は右シフト演算子です。

2

ビットシフト演算子です(<<は左シフト、>>は右シフト)。また、通常、ストリーミングオペレータ(<<はストリームアウト、>>ストリームを意味します) - 左側のストリームタイプ(たとえばstd::ostreamまたはstd::istream)と右側の他のタイプのストリームがオーバーロードされます。

0

< <と>>は単純演算子で、+、 - 、=、==、+ =、/ =などと同様に、ドリルを取得します。つまり、使用するオブジェクト/構造によって異なります。 coutとcinの場合、これらは読み取り/書き込み演算子ですが、オペレータに過負荷をかけて完全に異なる処理を行う可能性があります。

​​

ここでは誰もこれを行うべきではありませんが、この演算子でmyclassオブジェクトを使用すると、これが追加になります。だから、あなたが見ることができます: "< <"または ">>"で何をするかは、オペレータがどのように過負荷になっているかによって決まります。

関連する問題