无法弄清楚为什么使用重载比较运算符在执行前调用复制构造函数

Cant figure out why using overloaded comparison operator is calling a copy constructor before execution

本文关键字:执行 调用 构造函数 复制 运算符 比较 弄清楚 为什么 重载      更新时间:2023-10-16

作为编程类的作业,我正在为浮点数和动态内存分配编写类定义。 我们要构建一个类并使用运行它的测试驱动程序主程序,并告诉我们我们的代码是否正常工作。 我的课程代码远未完成,但这个问题让我发疯,我无法弄清楚。 每当调用重载的 == 运算符时,我的复制构造函数也会被调用。 我的上一篇文章,我因为发布太长的代码而收到了很多负面评论,所以我正在尽最大努力只发布查看问题所需的代码。

这是我的规格:

#include <iostream>
#include <ctype.h>
using namespace std;
class MyFloat
{
    enum {DefaultSizeTen=10};
    char *Number;
    int NumberOfDigits;
    int MaxNumberOfDigits;
public:
    ~MyFloat();//destructor
    MyFloat(const MyFloat & RHS);
    MyFloat();      //default constructor
    MyFloat(unsigned int Input); //create any length of MyFloat
    int Digits();
    int MaxDigits();
    MyFloat operator= (const char Input[]);

    int operator== (MyFloat x);
    MyFloat operator+ (MyFloat x);
    int operator> (MyFloat x);
    int operator< (MyFloat x);
    friend ostream& operator<< (ostream &Out, const MyFloat & X);
    friend istream& operator>> (istream &In, MyFloat & X);
};

在测试驱动程序中,这是使用重载 == 运算符的函数:

void TestComparison()
{
    MyFloat A, B, Sum;

    cout << "nn== == == == ==  Testing "== " for MyFloat  == == == == == nn";
    cout << "MyFloat variables have maximum length of " << A.MaxDigits() << endl;
    do
    {
        cout << "nEnter A  ==> ";
        cin  >> A;
        cout << "nEnter B  ==> ";
        cin  >>  B;
        cout << "n (A == B) is " << ((A == B) ? "TRUE " : "FALSE ") << endl;

    }
    while ( SpaceBarToContinue() );
}
正是

在这条线上cout << "n (A == B) is " << ((A == B) ? "TRUE " : "FALSE ") << ends;我遇到了我的问题。 在调用重载比较运算符之前,RHS 与另一个变量一起发送到复制构造函数中,一个我无法弄清楚它来自哪里的变量(以 *this 的形式进入复制构造函数)。 下面是复制构造函数:

MyFloat::MyFloat(const MyFloat & RHS)
{
    MaxNumberOfDigits=RHS.MaxNumberOfDigits;
    NumberOfDigits=RHS.NumberOfDigits;
    Number = new (nothrow) char[RHS.NumberOfDigits+1]; //+1 for overflow
    if (Number != NULL)
    {
        for (int i=0; i<=RHS.NumberOfDigits-1; ++i)
        {
            Number[i]=RHS.Number[i];
        }
    }
    else
        NumberOfDigits=0;
}

我不知道这是否是足够的信息,但我上次因为发布太长的代码而收到了一些负面反馈,所以我把它删掉了一堆。

无法弄清楚为什么使用重载比较运算符在执行前调用复制构造函数

您正在按值传递参数。

int operator== (MyFloat x);

将其更改为更惯用的形式:

  1. 将返回类型更改为 bool
  2. 使论点成为const&.
  3. 使成员函数成为const成员函数。

bool operator==(MyFloat const& x) const;