四、フロー挿入(右シフト)とフロー抽出(左シフト)演算子の再ロード


ストリーム挿入(右シフト)とストリーム抽出(左シフト)演算子の再ロード
一、討論
質問:1.cout << 5 << “this”; どうして成り立つの?2.coutは何ですか.「<<」はなぜcoutに使えるのですか?
回答:1.coutはiostreamで定義されたostreamクラスのオブジェクトです.2.「<<」がcoutに使えるのは、iostreamで「<<」をリロードしているからです.
新しい問題:どのように再ロードすればcout<<5になるかを考える.とcout<<「this」が成立しますか?
思考:ostreamクラスのメンバー関数を次のように再ロードする可能性があります.
void ostream::operator<<(int n)
{
    …… //  n   
    return;
}

このときcout<<5;すなわちcout.operator<<(5); cout << “this”; すなわちcout.operator<<( “this” );
新しい問題:cout<<5<<思考:上のcout.をoperator<(5)=voidがcoutになる.operator<<(5)=cout.operator<<. するとcout<<5<次のようになります.
ostream & ostream::operator<<(int n)
{
    …… //  n   
    return * this;
}
ostream & ostream::operator<<( const char * s )
{
    …… //  s   
    return * this;
}

二、例題
cがComplex複数クラスのオブジェクトであると仮定し、現在は「cout<>c;」と書くことができます.キーボードから「a+bi」形式の入力を受け付け、c.real=a,c.imag=bとすることができます.
プログラム:
class Complex {
    double real,imag;
    public:
        Complex( double r=0, double i=0):real(r),imag(i){ };
    friend ostream & operator<<( ostream & os, const Complex & c);
    friend istream & operator>>( istream & is,Complex & c);
};

ostream & operator<<( ostream & os,const Complex & c)
{
    os << c.real << "+" << c.imag << "i"; // "a+bi"     
    return os;
}

istream & operator>>( istream & is,Complex & c)
{
    string s;
    is >> s; // "a+bi"       , “a+bi”        
    int pos = s.find("+",0);
    string sTmp = s.substr(0,pos); //           
    c.real = atof(sTmp.c_str());//atof     const char*          float 
    sTmp = s.substr(pos+1, s.length()-pos-2); //           
    c.imag = atof(sTmp.c_str());

    return is;
}

int main()
{
    Complex c;
    int n;
    cin >> c >> n;
    cout << c << "," << n;

    return 0;
}

三、まとめ
ストリーム挿入演算子とストリーム抽出演算子を再ロードする方法は、次のとおりです.
istream & istream::operator>>(int n)
{
    …… //  n   
    return * this;
}
ostream & ostream::operator<<( const char * s )
{
    …… //  s   
    return * this;
}