繁体   English   中英

C ++类构造函数/析构函数

[英]C++ Class Constructor / Destructor

我有下面的代码。 每次调用构造函数时,我都会增加一个计数器,而每次调用析构函数时,计数器都会减少。 实例化三个类对象后,我尝试打印出计数器值。 然后我尝试在删除对象之一后再次打印出计数器值。 期望值为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;
} 

在C ++中,您可以通过三种方式构造对象:

  1. 使用“构造函数”
  2. 使用“复制构造函数”
  3. 使用“移动构造函数”

如果未定义它们,则编译器将自动为您编写代码(除非您阻止它明确执行此操作)。

您的方法MulAdd按值接受另一个复数,这意味着将使用复制构造函数调用来复制该调用的参数。 自动合成副本构造函数不会增加计数器。

您的方法将Complex对象作为参数(而不是对现有对象的引用),因此将为每个调用创建新对象,并在调用结束时将其销毁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM