【问题标题】:C++ Class Constructor / DestructorC++ 类构造函数/析构函数
【发布时间】:2014-05-27 23:32:15
【问题描述】:

我有以下代码。每次调用构造函数时,我都会增加一个计数器,每次调用析构函数时都会减少计数器。实例化三个类对象后,我尝试打印出计数器值。然后我尝试在删除其中一个对象后再次打印出计数器值。预期值为 4 和 3,但我得到的是 2 和 1。

我实际上尝试在 Constructor 和 Destructor 中打印出一些东西来观察它们实际被调用了多少次,但令人惊讶的是,除了我调用“删除对象”的时间之外,Destructor 还被调用了几次。是因为自动调用了析构函数吗?如果是这样,有没有办法关闭该功能来测试我的代码?

** 代码原本在类中有 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;
} 

【问题讨论】:

  • 你不显示 Mul 和 Add 的定义,复制它们的参数吗?
  • 我只是假设Add 和Mul 的参数是不是 引用(任何类似的)。
  • 对不起,我刚刚添加了定义!
  • This may help explain why。注意实现的 copy-ctor。
  • 旁注: Print 方法应该是静态的,因此它不需要调用 Complex 的实例。然后在类外用 Complex::Print() 调用它。

标签: c++ class object constructor destructor


【解决方案1】:

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

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

如果不定义它们,编译器会自动为您编写代码(除非您明确阻止它这样做)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 错了。仅当根本没有用户声明的构造函数时才会生成默认(“无参数”)构造函数。见stackoverflow.com/a/4944131/2192139这里编译器生成的是复制构造函数,它接受一个参数。
    • @Geier 够公平的。我没有语言规范。那么Complex com3;线上发生了什么?
    • 是一个无参数的构造函数。它恰好是带有完全填充默认参数的 args 的那个。 not 增加 count 的是隐式 copy-constructor,它由 param-inputs 触发,但相同的 destructor(duh ) 在 所有 情况下(复制构造或其他)被触发。
    • @WhozCraig 知道了——我什至没有注意到默认参数 ;-)
    猜你喜欢
    • 2011-04-03
    • 2010-12-16
    • 2015-06-30
    • 1970-01-01
    • 2012-04-10
    • 2012-11-14
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多