重载 C++ 运算符时遇到问题

Having issues with overloading C++ operators

我在理解这个概念时遇到了一些问题。在main.cpp文件中,我们有一个函数如下:

void TestComparison()
{
    MyFloat X, Y;

    cout << "\n\n============  Testing \"==\"  for MyFloat  ================\n";

    do
    {
        cout << "\nEnter X  ==> ";
        X.Read();
        cin.ignore(1000, '\n');             //  Discard all chars in input stream.
        cout << "\nEnter Y  ==> ";
        Y.Read();
        cin.ignore(1000, '\n');             //  Discard all chars in input stream.

        cout << "\n\n";

        if ( X == Y )
        {
            X.Write(); cout << " is equal to "; Y.Write();
        }
        else
        {
            X.Write(); cout << " is NOT equal to "; Y.Write();
        }
    }
    while ( SpaceBarToContinue() );
}

这是class我正在写的:

class MyFloat
{
    enum {MAXDIGIT=20};
    char Number[MAXDIGIT+1];
    char NumberOfDigits;

public:

    friend void AssignValue(MyFloat& X);//remove after the program works

    MyFloat();

    int Digits();
    int MaxDigits();
    void Read();
    void Write();

    MyFloat operator + (MyFloat x);
    int operator== (MyFloat x);
};

这是我的 == 重载函数存根:

int MyFloat::operator== (MyFloat x)
{
    int Flag=0;

    return 1;
}

这样做的唯一目的是比较两个对象数组 X 和 Y。它们被传递到 == 重载函数中。我应该编写比较它们的算法。我知道如何编写比较这两个字符数组的算法,这不是问题,但我不明白的是 X 和 Y 如何进入重载函数来比较它们?大体上,代码( X == Y )用于获取0或1。X和Y如何传递到函数中?

例如,我假设我的函数存根需要用 2 个参数重写:

int MyFloat::operator== (MyFloat x, MyFloat y)
{
    int Flag=0;

    return 1;
}

但是这样做会在 ( X == Y ) 的函数调用期间在 main 中产生一个错误,指出 'Overload "operator==" must be a binary operator (has 3 parameters)'

所以我对如何将 MyFloat 的两个对象都放入函数中进行比较感到非常困惑。我对编程还很陌生(学习了 5-6 个月),非常感谢任何简单明了的答案。

成员函数(包括重载运算符)有一个隐含的 this 参数传入。在你的情况下,因为你使用的是 operator== 的成员版本,你应该只需要一个参数,另一个是 this.

您应该使用 this 指针。更多信息:Source

bool MyFloat::operator==(const MyFloat& x) const
{
    for(int i = 0; i < x.MaxDigits; ++i)
    {
        if(x[i] != (*this)[i])
            return false;
    }
    return true;
}

当你写:

if(a == b)

真正的意思是:

if(a.operator==(b))

所以在你的方法中:

bool MyFloat::operator==(const MyFloat &x) const
{
    // x is b in call above
    // (*this) is a in call above

    // Your class invariant should guarantee this:
    // assert(x.NumberOfDigits < MAX_DIGITS);

    // In the scope of your class' methods:
    //   NumberOfDigits corresponds to this->NumberOfDigits
    //   Number corresponds to this->Number
    if(x.NumberOfDigits != NumberOfDigits) return false;
    // Same as: if(x.NumberOfDigits != this->NumberOfDigits) return false;
    return strncmp(x.Number, Number, NumberOfDigits) == 0;
    // Same as: return strncmp(x.Number, this->Number, this->NumberOfDigits) == 0;
}

请注意,我更改了您方法的签名。正确的签名 returns a bool 并采用 const (因为您不想更改参数)引用(避免复制大对象)作为参数。该方法是(并且必须是)const,因为它不应该修改对象,并且它必须可以在 const 对象上调用。

请注意,可以使用以下签名将运算符定义为非成员函数(即在 class 之外):

bool operator==(const MyFloat &a, const MyFloat &b)