//楼上的回答的很好,但没有解答重点.
complex complex::operator +(complex c2) //这步不是很理解
{
return complex([this.]real+c2.real,[this.]imag+c2.imag);//这样就容易理解了
}
/*
“+” ,”-”是双目运算符,为什么在程序中的重载函数中只有一个参数呢?实际上,运算符重载函数有两个参数,由于重载函数是Complex类中的成员函数,有一个参数是隐含的,运算符函数是用this指针隐式地访问类对象的成员。
可以看到,重载函数operator+访问了两个对象中的成员,一个是this指针指向的对象中的成员,一个是形参对象中的成员。如this->real+c2.real,this->real就是c1.real。
在将运算符函数重载为成员函数后,如果出现含该运算符的表达式,如c1+c2,编译系统把它解释为c1.operator+(c2)
即通过对象c1调用运算符重载函数,并以表达式中第二个参数(运算符右侧的类对象c2)作为函数实参。运算符重载函数的返回值是Complex类型,返回值是复数c1和c2之和(Complex(c1.real + c2.real,c1.imag+c2.imag))。
*/
//可参考:
http://zhidao.baidu.com/question/69566035.html
complex complex::operator +(complex c2) //这步不是很理解
{
return complex(real+c2.real,imag+c2.imag);
}
函数最好写成complex complex::operator+(const complex& c2)
{
return complex(real+c2.real,imag+c2.imag);
}
这个函数返回一个complex的对象,重载的运算符是"+","+"的左边是对象本身,右边是另外一个对象,返回值也是一个对象
return语句通过调用complex的构造函数返回一个complex的对象
complex c1(5,4),c2(2,10),c3;
c3=c1+c2;
这2句,c1(5,4),c2(2,10)分别调用了构造函数c1.complex(5,4)和c2.complex(2,10),c3调用了c3.complex(0,0);
c3=c1+c2右边调用了c1.operator+(c2),因此函数体中参与运算的是c1和c2的引用(修改以后的版本),然后通过构造函数complex()返回一个complex对象,并且赋值给c3(赋值的过程中使用了默认复制构造函数,默认复制构造函数可以通过重载"="来自定义)
参数用const complex& c2而不用complex c2的原因:
1.2个都是可以的,但前者更好
2.后者是对象实参作为参数,在调用的时候需要复制一个c2的副本参与函数体运算,如果c2比较复杂的话,将会增加额外的系统开销
3.前者是一个对象的引用,调用的时候不会复制c2的副本,所以不产生额外的开销
4.为了保证c2不被意外改变,而且我们也不需要改变它,所以定义成const
complex complex::operator +(complex c2) //这步不是很理解
//第一个complex表明这个函数返回值的类型,第二个complex表明作用域是来自于complex这个类的成员函数。
{
return complex(real+c2.real,imag+c2.imag);
//complex 表明返回值类型。
}