请教C++高手一道运算符重载的问题

来源:百度知道 编辑:UC知道 时间:2024/05/18 04:06:28
下面这个运算符重载原型:CSAI operator-(CSAI&,int)参数表里有两个参数是因为重载为全局函数吗?
重载为成员函数不是参数表要减一吗,参数表最多也只能是一个参数啊

下面这个运算符重载原型:CSAI operator-(CSAI&,int)参数表里有两个参数是因为重载为全局函数吗?

的确如此。这里,减号- 是二元运算符,有两个参数是正常的。如果是重载为类的成员函数:
class CSAI
{
// ...
public:
CSAI operator -(int n) {/*...*/}
// ...
};
这样的话就只需要一个参数,省略了CSAI对象引用,这是因为:成员函数必定是通过类的实例对象来调用(除了静态成员函数),比如,你要调用CSAI中的某个函数,肯定需要先生成一个CSAI的对象,再利用这个对象去调用。而成员函数在被调用时会自动将对象本身“作为参数表第一个参数”传递到函数里(你在编写成员函数内容的时候,可以使用成员属性、可以调用其他成员函数,就是这个原因)。所以,运算符重载为成员函数后就不需要那个对象引用的参数。
好吧,你可能会有第二个问题:重载为成员函数可以省略一个参数,多方便,为什么还要重载成全局函数?这是因为对于二元运算符来说,有一个参数顺序的问题,这在加号+、乘号*这类运算符上体现的特别明显。按照人们的习惯,这类运算结果与运算顺序是无关的,a+b跟b+a结果应该是一样的。现在问题来了。假设CSAI类中重载了加号运算符:
class CSAI
{
// ...
public:
CSAI operator +(int n) {/*...*/}
// ...
};
然后你定义了一个CSAI对象c,一个int变量n:
CSAI c;
int n = 10;
你会发现,c+n可以正确运行,而n+c将导致编译错误。原因嘛,上面已经说过了,在成员函数中,被省略的实例对象这个参数是第一个参数,而在n+c操作中,第一个参数是int型,第二个才是CSAI对象,不出错才叫诡异。
为了解决这种问题,可行的办法就是将运算符重载为全局函数,而加号这类运算符需要重载两次:
CSAI operator +(CSAI &c, int n) {/* ... */}
CSAI opera