无法弄清楚为什么使用重载比较运算符在执行前调用复制构造函数
Cant figure out why using overloaded comparison operator is calling a copy constructor before execution
作为编程类的作业,我正在为浮点数和动态内存分配编写类定义。 我们要构建一个类并使用运行它的测试驱动程序主程序,并告诉我们我们的代码是否正常工作。 我的课程代码远未完成,但这个问题让我发疯,我无法弄清楚。 每当调用重载的 == 运算符时,我的复制构造函数也会被调用。 我的上一篇文章,我因为发布太长的代码而收到了很多负面评论,所以我正在尽最大努力只发布查看问题所需的代码。
这是我的规格:
#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);
将其更改为更惯用的形式:
- 将返回类型更改为
bool
。 - 使论点成为
const&
. - 使成员函数成为
const
成员函数。
bool operator==(MyFloat const& x) const;
相关文章:
- 是否可以依赖函数范围的静态变量来执行程序关闭期间调用的方法?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- 无法调用成员函数,尝试正确执行此操作仍然失败
- 不执行任何操作的函数调用C++
- 在 c++ 托管和异步运行中调用 c# 可执行文件
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 如何执行参数化构造函数的调用?
- 当再次触发信号时,从Qt插槽执行的功能被第二次调用时会发生什么?
- 在可变函数调用中执行一次语句
- 如何在派生类中不显式调用base::func()的情况下从基类执行虚拟函数
- 只有一个可执行文件即可进行跨平台 SIMD 调用?
- 调用函数来创建 WinAPI 按钮不会执行任何操作
- 从 PHP 调用已编译的C++可执行文件来创建套接字
- 如何让派生类在调用基类之前执行操作?
- 在 MySQL 连接器C++ API 中使用一个函数调用执行多个查询的正确方法是什么?
- 在链接的程序集文件中,我想从 c++ 调用代码访问变量.是否可以在不触发访问冲突的情况下执行此操作?
- 仅执行一次函数一次内部循环,该循环在每个0.1秒C 处都被调用
- 如何测试基类中的方法是否已使用谷歌模拟调用和执行?
- 编译器是否对所有内联函数调用执行相同的操作
- 动态执行的 ARM ASM 系统调用,可从C++重新定位