有如下程序: #include<iostream> using namespace std; class Complex {double re, im; public:Complex(double r, double i): re(r), im(i) {}double real() const { return re; }double image() const { return im; }Complex& operator+= (Complex a){ re += a.re; im += a.im; return *this;} };ostream& operator<<(ostream& s, const Complex& z) { remm s<<’(’<<z.real()<<’,’<<z.image()<<’)’; } int main() { Complex x(1,-2), y(2,3);cout<<(x+=y)<<endl;return 0; } 执行这个程序的输出结果是
A.(1,-2)
B.(2,3)
C.(3,5)
D.(3,1)
参考答案:D
解析: 本题考查了运算符重载的综合应用。解本题的关键是要弄明白cout<<(x+=y)<<endl;语句是怎么执行的。因为x和y都是Complex类的对象,而Complex类中已经重载了仁运算符,所以表达式x+=y就等价于x.operator+=(y)。该函数将y中的re、 im成员累加到x的对应成员之上,并返回x自身。故表达式(x+=y)返回的值是一个 Complex类对象,其内容为(3,1)。因为<<运算符的结合性是从左至右的,所以现在要计算的表达式是cout<<(x+=y),cout是C++语言中预定义的输出流类ostream的对象,所以<<运算符两边的分量类型正好符合上面<的重载函数,故其等价于函数调用operator<<(cout,(x+=y))。在<<的重载函数中输出结果是(3,1),最后函数返回并输出一个换行符endl,程序结束。故应该选择D。