我有以下代码。每次调用构造函数时,我都会增加一个计数器,并且每次调用析构函数时计数器都会减少。在实例化三个类对象后,我尝试打印出计数器值。然后我尝试删除其中一个对象后再次打印出计数器值。预期值为4和3,但我得到2和1.
我实际上尝试在构造函数和析构函数中打印出一些内容,以观察实际调用它们的次数,但令人惊讶的是,除了调用“删除对象”之外,还多次调用了析构函数。是因为析构函数是自动调用的吗?如果是这样,有没有办法关闭该功能来测试我的代码?
**代码最初在类中有Add和Mult函数,但我在此省略,因为函数的细节在这里似乎无关紧要。
#include <iostream>
using namespace std;
class Complex{
private:
double x, y;
static int count;
Complex Add(Complex como)
{
Complex t;
t.x=x+como.x;
t.y=y+como.y;
return t;
}
Complex Mul(Complex como)
{
Complex t;
t.x=(x*como.x)-(y*como.y);
t.y=(y*como.x)+(x*como.y);
return t;
}
public:
Complex(double a=0, double b=0) : x(a), y(b) {count++;}
~Complex() {count--;}
void Print() {cout << "(" << x << ", " << y << ")" << endl;}
static int GetCount() {return count;}
};
int Complex::count=0;
int main()
{
Complex com1(1.0, 2.0), com2(3.0, 4.0);
Complex com3;
com1.Print(); cout << endl;
com2.Print(); cout << endl;
com3 = com1.Add(com2); com3.Print(); cout << endl;
Complex *pcom4 = new Complex;
*pcom4 = com1.Mul(com2); pcom4->Print(); cout << endl;
cout << "#complex numbers = " << com1.GetCount() << endl;
delete pcom4;
cout << "#complex numbers = " << com1.GetCount() << endl;
return 0;
}
答案 0 :(得分:4)
在C ++中,您可以通过三种方式构建对象:
如果不定义它们,编译器会自动为您编写代码(除非您不再明确地执行此操作)。
您的方法Mul
和Add
按值接受其他复数,这意味着将使用复制构造函数调用来复制调用的参数。
自动合成复制构造函数不会递增计数器。
答案 1 :(得分:2)
您的方法将Complex
个对象作为参数(不是对现有对象的引用),因此正在为每个调用创建新对象,并在调用结束时将其销毁。