C++ 有过载C+的问题+;操作员

C++ 有过载C+的问题+;操作员,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,我在理解这个概念时遇到了一些问题。在main.cpp文件中,我们有一个函数,如下所示: void TestComparison() { MyFloat X, Y; cout << "\n\n============ Testing \"==\" for MyFloat ================\n"; do { cout << "\nEnter X ==> "; X.Read();

我在理解这个概念时遇到了一些问题。在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() );
}
下面是my==重载函数存根:

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

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

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

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

    return 1;
}
但是这样做会在函数调用
(X==Y)
期间产生一个错误,指出“重载”运算符==“必须是二进制运算符(有3个参数)”


所以我完全搞不清楚如何将MyFloat的两个对象都放入函数中进行比较。我对编程还是相当陌生(学习了5-6个月),非常感谢任何简单明了的答案。

成员函数(包括重载运算符)有一个隐式的
参数传入。在您的情况下,因为您使用的是
操作符==
的成员版本,所以您应该只需要一个参数,另一个参数是
this
,您应该使用
this
指针。有关更多信息:

bool MyFloat::operator==(const MyFloat&x)const
{
对于(int i=0;i
当你写:

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;
}

请不要发表评论。我怎样才能改进这个答案?我不是反对者,但也许你的答案被否决了,因为它可以通过示例代码或一些参考来改进。顺便说一句,这是一个有效的解决方案,因此它非常不公平:(
operator==
应该真正返回一个
bool
,而不是
int
。可能的重复看看这个答案:您已经声明了操作符为类成员,因此它接受隐式成员。您应该将它实现为类MyFloatOff的非成员主题:此注释是一个谎言:
cin.ignore(1000),\n');//丢弃输入流中的所有字符。
行上可能有1000多个字符,流中可能有多行。您可能要处理的第一种情况是
cin.ignore(numeric_limits::max(),“\n”)
旁注:您的读/写成员函数不是很灵活。您可能更喜欢重写
操作符
,这样您就可以写:
cin>>x;
我想您的意思是说
这个[I]
不是
这个.x[I]<代码> MyFloat < <代码>没有成员<代码> x<代码>。它不处理不同大小的<代码> MyFloats < /C>和语法错误。几乎是正确的想法。它只是给出了一个想法,将主代码改进为代码SnpPultCulter代码,不剪切和粘贴,但是<代码> > x。C++不是java,man。eally.That必须用
(*this)[i]
this->operator[](i)调用
。我真正的抱怨是试图用
而不是
->
多年的实践从指针访问成员。我唯一要提出的问题是断言,但这是一个意识形态问题。应该测试无效大小,并在构造或设置时拒绝,以便对象永远不会处于非法状态d你不必测试get。通常get比集合多。是的,我在把它放在现实中还是仅仅作为一个注释之间犹豫了。我也不太喜欢assert的用法,它只是为了强调类不变量和一个事实,
strncmp
不需要有风险。好吧,现在我完全糊涂了。我给我的教授发了电子邮件他说在不使用*this的情况下进行函数重载,并且只有一个对象会通过参数传入。所以我不知道,如果我们不使用*this,我不知道另一个对象是如何传入的。你可以不用
this
访问成员。在该方法中,
NumberOfDigits
相当于
this->numberfofdigits
所以也许这就是你的教授所说的“不使用(*this)”:意思是不明确地使用它。我用这些信息更新我的答案。
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;
}
bool operator==(const MyFloat &a, const MyFloat &b)