0

我在网上找到了很多教程/片段,建议使用这种类型的重载:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2) { ... }

但是如果我把这个定义放在我的 .h 文件中:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2);

我有这个错误: http: //msdn.microsoft.com/it-it/library/1zy85x1e (v=vs.80).aspx

所以我发现我必须像这样定义重载:

NumeroFarlocco operator+( NumeroFarlocco n2 );

但在实现中,我无法理解如何访问操作中涉及的第一个元素的实例变量(我之前的代码中的 n1 元素),this->variable 不起作用,变量也不...

4

5 回答 5

2

有两种方法可以重载二元运算符:

  • 作为班级成员
  • 作为自由运营商

两者在不同的上下文中都有效:

struct A
{
    A operator+ (const A& other) const;
};

struct A
{};
operator+(const A& first, const A& second);

注意使用const.

作为成员,要添加的两个对象是*thisother。第一个是隐式当前对象。

作为自由运算符,这两个对象是作为参数传递的对象。

于 2013-01-31T16:26:17.800 回答
1
NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2)

应该是一个out-of-class定义,也就是一个自由函数。

class NumeroFarlocco {
  // ...
};

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2) {
  // ...
}

如果你使用NumeroFarlocco operator+( NumeroFarlocco n2 );它进入类定义。是的,this指针是您访问左侧值的方式。

于 2013-01-31T16:25:53.050 回答
0

我想稍微扩展一下 Luchian Grigore 的回答。正如他所说,从技术上讲,有两种定义二元运算符的方法。然而,在实践中,通常遵循一定数量的约定;特别是,返回新对象的二进制对象(如operator+)通常被定义为非成员,而那些修改左操作数(如 operator+=)的二进制对象通常被定义为成员。此外,经常使用修改对象的函数来定义返回对象的函数,例如:

MyType
operator+( MyType const& lhs, MyType const& rhs )
{
    MyType results( lhs );
    results += rhs;
    return results;
}

事实上,我通常什至不编写返回值的函数。我编写了一个定义它们的基类模板,并从中派生:

template <typename DerivedClass>
class MathematicOperators
{
    friend DerivedClass
    operator+( DerivedClass const& lhs, DerivedClass const& rhs )
    {
        DerivedClass results( lhs );
        results += rhs;
        return results;
    }
    //  And so on for all of the binary operators...
};

class MyClass : MathematicOperators<MyClass>
{
    //  ...
    MyClass& operator+=( MyClass const& other )
    {
        //  modify *this...
        return *this;
    }
    //  ...
};

(注意这里的朋友MathematicOperators不是为了能够访问派生类的私有成员,而是为了能够在类模板中内联定义自由函数。)

我强烈建议遵循此程序。它将导致更少的代码,并将保证++= 具有预期的关系。

于 2013-01-31T16:54:28.927 回答
0

首先,您可能想阅读以下教程以了解有关如何重载运算符的一些基本规则。

从您的原始代码开始:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2);

这可能不是您真正想要声明的。您声明 operator+ 的方式取决于您想要实现的目标。

从你的问题假设,你想重载二进制+,所以你会这样做:

friend NumeroFarlocco operator+(NumeroFarlocco n1 , NumeroFarlocco n2 );

或者正如您在上面声明的那样:

NumeroFarlocco operator+( NumeroFarlocco n2 );

这两个声明的区别在于第一个是friend(free funcion),而第二个是成员函数。

第一个(使用友元函数)意味着你不通过对象调用函数(它就像一个全局函数),第二个意味着你必须通过对象调用这个函数(就像你通常对成员函数所做的那样)。

另外,永远记住 operator 是一个函数。

NumeroFarlocco x, y, z; // suppose you have empty/default c'tor

x = y + z  is equivalent to x.operaotr=(y.operator+(z))

希望对你有帮助,辛迪加!

于 2013-01-31T16:55:37.373 回答
0

这是两种不同的东西,

第一种方法:

NumeroFarlocco operator+(NumeroFarlocco n1, NumeroFarlocco n2);

全局定义如何解释 + 运算符。

那确实意味着:

NumeroFarlocco n = operator+(n0,n2);

至于第二个:

NumeroFarlocco operator+( NumeroFarlocco n2 );

定义如何解释一个到另一个的加法。

那是:

NumeroFarlocco n = n0.operator+(n1)
于 2013-01-31T16:26:50.203 回答