2017-08-19 159 views
3

我得到这个操作符重载如何在这里工作在这个代码.....在这种情况下,操作符重载如何工作?

class operatorOver { 
public: 
    int a, b, c; 
}; 

operatorOver operator+(const operatorOver &a, const operatorOver &b) { 
    operatorOver aa; 
    aa.a = b.a + a.a; 
    return aa; 
} 

int main() 
{ 
    operatorOver aaa, bbb, ccc; 

    aaa.a = 100; 
    bbb.a = 200; 
    ccc = aaa + bbb; 

    cout << ccc.a << endl; 

    system("pause"); 
}; 

但是这个版本我不明白这其中的工作原理这里....

class operatorOver { 
public: 
    operatorOver operator+(const operatorOver &a) { 
     operatorOver aa; 
     aa.a = (*this).a + a.a; 
     return aa; 
    } 

    int a, b, c; 
}; 

int main() 
{ 
    operatorOver aaa, bbb, ccc; 

    aaa.a = 100; 
    bbb.a = 200; 
    ccc = aaa + bbb; 

    cout << ccc.a << endl; 

    system("pause"); 
}; 

的我展示的第一个,我假设在这里操作符重载的代码正在考虑到2个对象类以便它工作...

但是,第二个示例如何显示我不需要在其参数中创建另一个对象类,但仍然有效。 ..当你在main()中看时,你会发现有2个对象类仍在传递....我迷路了。

+0

顺便说一句,我更喜欢第一种方式(非成员函数)因为在这种情况下,在'a + b'中,如果a不是operatorOver,并且operatorOver具有从a类型到operatorOver的转换构造函数,它将被调用,而使用成员函数则不会。旁注:除非你有充分的理由不要,否则请以大写字母开始上课。如果大多数C++开发人员使用骆驼案例,这是习惯。所以OperatorOver而不是operatorOver。 –

回答

3

某些二元运算符(如+)可以作为成员函数以及非成员函数进行重载。

+作为成员函数重载时,该函数需要用一个参数声明。当操作员被用作:

a + b 

当超载作为非成员函数调用被解析为

a.operator+(b); 

,该功能需要两个参数来声明。当操作员被用作:

a + b 

呼叫被解析为

operator+(a, b); 

延伸阅读:http://en.cppreference.com/w/cpp/language/operators

+0

ohhhhhhhhhhh我现在明白了,ty!所以让我弄清楚这一点......如果超载操作符是在类结构中定义的,它将成为'a。运算符+(b)',但是当超载运算符被定义在类结构之外时,它将变成'运算符+(a,b)'...... – thundergawd

+0

@thundergawd,欢迎您。很高兴我能够提供帮助。 –

+0

仍然有一个问题......为什么它需要(*这个)为了第一个例子工作?是(* this)== aaa?为什么会这样?编辑 - 哦nvm,我只是想出来,非常多! – thundergawd

3

在第二个示例中,传递了两个对象。有a,也有this。作为this传递的对象是操作的左侧。

另请注意,您的会员operator+应该是const,因为它不改变this的任何数据成员。

您的会员运营商还援引未定义的行为,因为你使用的是未分配的值:

// The member function 
operatorOver operator+(const operatorOver &a) { 
    operatorOver aa; 

    // What is the value of aa.a? Undefined behavior! 
    aa.a = aa.a + a.a; 
    return aa; 
} 

等同于你非成员函数,它应该是这样实现:

// The member function 
operatorOver operator+(const operatorOver &a) const { 
    operatorOver aa; 

    // Member `a`, could be written `this->a` 
    aa.a = a + a.a; 
    return aa; 
} 
+0

是的,我刚刚更新了我的代码修正大声笑,我忘记把(*这),在我有之前,但改变它来演示第一个前。并回去修理第二届前。我忘了把它写得正确..... – thundergawd

相关问题