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

时间:2016-04-24 05:19:30

标签: c++ comparison operator-overloading copy-constructor

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

这是我的规范:

#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 << "\n\n== == == == ==  Testing \"== \" for MyFloat  == == == == == \n\n";

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

我不知道这是否是足够的信息,但我上次发布了太长时间的代码后得到了一些负面的反馈,所以我把它修剪了一堆。

1 个答案:

答案 0 :(得分:2)

  

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

您正在按值传递参数。

int operator== (MyFloat x);

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

  1. 将返回类型更改为bool
  2. 将参数设为const&
  3. 使成员函数成为const成员函数。
  4. bool operator==(MyFloat const& x) const;