正如C++ Primer中的例子,当重载 + 时不需要设置为友元,因为可以用public成员operator += 实现,这说明:首先,重载运算符为成员函数时相当于提供一个接口,一定是public的;其次,就是不是一定要声明为friend的,要据具体情况而定。
当重载运算符为成员函数时,如果遇到调用时第一操作数是数字,则会因为不能进行类型转换而报错,这时通常建议重载为友元函数。当然也可以有另一种解决办法,即增加构造函数以实现类型转换,这样也会带来二义性的潜在危险,比如说,构造函数中形参是double和long两种,被转换数是int型,则编译器会报错,因为不确定调用哪一个构造函数。
通常,推荐的选择如下:
1、复制( = ),下标( [ ] ),调用( ( ) )和成员访问箭头( - > )等操作符必须定义为成员,将这些操作符定义为非成员函数将在编译时标记为错误;
2、对于复合赋值运算符“+ =,-=,/=,*=,&=,!=,~=,%=,<<=,>>=”建议重载为成员函数,但是定义为非成员函数也不会报错;
3、改变对象状态或与给定类型紧密联系的一些操作符,如++ 、--、*(解引用),通常定义为成员函数;
4、对于单目运算符,建议选择成员函数;
5、对称的操作符,如算术操作符、相等操作符、关系操作符和位操作符最好定义为普通的非成员函数。
6、输入输出操作符为非成员函数。