四、フロー挿入(右シフト)とフロー抽出(左シフト)演算子の再ロード
ストリーム挿入(右シフト)とストリーム抽出(左シフト)演算子の再ロード
一、討論
質問:1.cout << 5 << “this”; どうして成り立つの?2.coutは何ですか.「<<」はなぜcoutに使えるのですか?
回答:1.coutはiostreamで定義されたostreamクラスのオブジェクトです.2.「<<」がcoutに使えるのは、iostreamで「<<」をリロードしているからです.
新しい問題:どのように再ロードすればcout<<5になるかを考える.とcout<<「this」が成立しますか?
思考:ostreamクラスのメンバー関数を次のように再ロードする可能性があります.
このときcout<<5;すなわちcout.operator<<(5); cout << “this”; すなわちcout.operator<<( “this” );
新しい問題:cout<<5<<思考:上のcout.をoperator<(5)=voidがcoutになる.operator<<(5)=cout.operator<<. するとcout<<5<次のようになります.
二、例題
cがComplex複数クラスのオブジェクトであると仮定し、現在は「cout<>c;」と書くことができます.キーボードから「a+bi」形式の入力を受け付け、c.real=a,c.imag=bとすることができます.
プログラム:
三、まとめ
ストリーム挿入演算子とストリーム抽出演算子を再ロードする方法は、次のとおりです.
一、討論
質問: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<<
ostream & ostream::operator<<(int n)
{
…… // n
return * this;
}
ostream & ostream::operator<<( const char * s )
{
…… // s
return * this;
}
二、例題
cがComplex複数クラスのオブジェクトであると仮定し、現在は「cout<
プログラム:
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;
}