Complex Complex::operator+(const Complex &c2){}
对于上面的+,之所以知道它为二元运算是因为 由上面的函数形式可知,这是一个成员函数,
因此隐含地有 operatpr+(Complex *this,Complex &c2) 。
用Complex Complex::operator+(Complex &c2)定义的是复数+复数;
用Complex Complex::operator+(double &d)定义的是复数+实数;
而对于Complex c4=3.14+c2来说,不管用上面的哪个函数都是不对的,因为这个表达式需要的
是实数+复数:
可以用友元函数实现Complex operator+(double &d,Complex &c){}
也可以用普通函数
但是不可以用成员函数实现!!!
运算符重载函数可以是类的成员函数:
它可以通过this指针自由访问本类的数据成员,少写一个函数的参数,但是有一个要求就是运算的第一个运算量必须是当前类的对象;
运算符重载函数也可以是类的友元函数:
如果运算符左侧的操作数属于c++标准类型(如int)或是一个其他类的对象,则运算符重载函数不能选用成员函数
为方便访问类的私有成员,声明为友元函数为佳
运算符重载函数还可以是普通函数:
但是普通函数一般不能直接访问类的私有成员
友元的使用会破坏类的封装,原则上要尽量将运算符函数作为成员函数;
一般单目运算符重载为成员函数,双目运算符重载为友元函数;
对于数学上交换律成立的运算符,应两次重载运算符:比如复数+实数;实数+复数
有的运算符必须定义为类的成员函数
如:赋值运算符,下标运算符,函数调用运算符
有的运算符则不能定义为类的成员函数
如:流插入<< 流提取>> 类型转换运算符