1

I/O 演算子をオーバーロードしました:

struct Time {
  int hours;
  int minutes;
};

ostream &operator << ( ostream &os, Time &t ) {
  os << setfill('0') << setw( 2 ) << t.hours;
  os << ":";
  os << setfill('0') << setw( 2 ) << t.minutes;
  return os;
}

istream &operator >> ( istream &is, Time &t ) { 
  is >> t.hours;
  is.ignore(1, ':');
  is >> t.minutes;
  return is;
}

cin >> timeコンパイラがis &is引数を決定する方法をいつ呼び出すかを知りたいです。ここに私のmain()プログラムがあります:

operator>>( cin, time );
cout << time << endl;

cin >> (cin , time);
cout << time << endl;

cin >> time;                     //Where is cin argument???
cout << time << endl;
4

1 に答える 1

4
cin >> time;

これは>>、2 つのオペランドを持つ演算子です。オーバーロードされた演算子関数が非メンバーとして見つかった場合、左のオペランドが最初の引数になり、右のオペランドが 2 番目の引数になります。したがって、次のようになります。

operator>>(cin, time);

したがって、cin引数は演算子の最初のオペランドにすぎません。

標準の§13.5.2を参照してください。

二項演算子は、1 つのパラメーターを持つ非静的メンバー関数 (9.3) または 2 つのパラメーターを持つ非メンバー関数によって実装されます。したがって、任意の二項演算子@について、はまたはx@yとして解釈できます。x.operator@(y)operator@(x,y)

これが連鎖演算子にどのように適用されるのか疑問に思っている場合は、次のようにしてください。

cin >> time >> something;

これは次と同等です。

(cin >> time) >> something;

これは以下と同等です:

operator>>(operator>>(cin, time), something);
于 2013-03-15T09:57:15.137 に答える