簡體   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