C++ 为什么我连续用两次我自己定义的重载运算符就会出错

不提示出错但我说的出错是比如:p3=p1-p2;p4=p2-p1;我的重载运算符是friendList<A>operator-(List<A>x1,List<A>x2);... 不提示出错 但我说的出错是 比如:p3=p1-p2; p4=p2-p1; 我的重载运算符是
friend List<A> operator- (List<A> x1,List<A> x2);
具体代码就不贴出来了 太多了 我的问题是:不管我第二个是p2-p1还是p1-p2它始终用第一个的p1-p2带入形参 求高手赐教!!!
展开
 我来答
084vsyguv
2011-06-11 · TA获得超过558个赞
知道小有建树答主
回答量:1274
采纳率:0%
帮助的人:0
展开全部
下面这个运算符重载原型: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 operator +(int n, CSAI &c)

顺带罗嗦一句,通常运算符重载我差不多都写成这样:
const CSAI operator +(const CSAI &c, int n)
返回类型前的const是为了保持运算符的操作一致性。比如说下面的代码:
int a=10, b=5;
a+b = 20;
这肯定会编译报错。但是,如果返回类型前没有const,那么:
CSAI c1, c2;
int n = 5;
c1+n = c2;
这种代码就可以顺利通过编译,可能连警告都没有。这样的话,你定义的加号操作跟内部规则就有了出入。因此推荐做法是加上const。
至于参数类型前的const,名义上是防止你在函数中对CSAI对象有什么动作(比如:改改属性值),实际上基本没什么用,最多也就是让调用者安心(放一百二十个心好了,本函数不会把你的宝贝对象怎么样的)。看自己习惯了。
追问
你那个参数是不一样的  可以重载 我的是一样的 不能重载....
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式