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;

这是>>具有两个操作数的运算符。如果重载的运算符函数被发现为非成员,则左操作数成为第一个参数,右操作数成为第二个参数。所以它变成:

operator>>(cin, time);

所以cin参数只是运算符的第一个操作数。

见标准§13.5.2:

二元运算符应由具有一个参数的非静态成员函数 (9.3) 或由具有两个参数的非成员函数实现。因此,对于任何二元运算符@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 回答