#include <iostream> #include <vector> using namespace std; class Obj { public: Obj(void){cout<<"Obj(void)"<<" "<<countOne<<endl;countOne++;} Obj(int x){cout<<"Obj(int x)"<<" "<<countThree++<<endl;} Obj(const Obj &b) {cout<<"復制構造函數:"<<endl;} ~Obj(void){cout<<"Destroy"<<" "<<countTwo++<<endl;} void GetCount(int x){ countOne = x;} private: static int countOne; static int countTwo; static int countThree; static int countFour; }; int Obj::countOne(0); int Obj::countTwo(0); int Obj::countThree(0); int main (void) { vector<Obj> obj(10); vector<Obj> obj2(10,0); return 0; }
結果如下:
//執行了構造函數2次,20次復制構造函數,析構函數22次
//我想提出的問題是上圖中第1-3行
//在第一次使用vector和第二次使用vector之間為什么執行一次析構函數
//[補充]這是老師的回答
#include <iostream>
#include <vector>
using namespace std;
class Obj
{
public:
Obj(void){cout<<"Obj(void)"<<" "<<countOne<<endl;countOne++;}
Obj(int x){cout<<"Obj(int x)"<<" "<<countThree++<<endl;}
~Obj(void){cout<<"Destroy"<<" "<<countTwo++<<endl;}
void GetCount(int x){ countOne = x;}
private:
static int countOne;
static int countTwo;
static int countThree;
};
int Obj::countOne(0);
int Obj::countTwo(0);
int Obj::countThree(0);
int main (void)
{
//關於vector的說明以及其構造函數與析構函數
//以下調用是調用的vector<Obj>模板類的構造函數 vector(size_type n, const Obj& v = Obj());
//在vector的構造函數調用過程中使用了默認形參const Obj& v= Obj(),會自動調用一次Obj的默認構造函數,
//然后vector類的構造函數內部中會自己調用Obj的拷貝構造函數創建10個拷貝,離開vector的構造函數后會自動調用Obj的析構函數銷毀默認形參v
vector<Obj> obj(10);
//以下調用也是調用了vector<Obj>模板類的構造函數 vector(size_type n, const Obj& v = Obj());
//不同的是第二個參數傳遞的本應是一個Obj類型的引用或不設置,而這里卻使用了整型參數,但這不是錯誤,因為做使用參數傳遞時,系統會自動
//尋找是匹配的參數,如果沒有匹配的參數,還會用參數去匹配類類型的形參的構造函數參數,這里就是這種情況,這里是使用了Obj類的構造函數Obj(int x)
//同樣,在vector類的構造函數內部中會自己調用Obj的拷貝構造函數創建10個拷貝,離開vector的構造函數后會自動調用Obj的析構函數銷毀自動構造的形參
vector<Obj> obj2(10,0);
return 0;
//在離開main函數時會調用vector的析構函數,它會自動調用其內嵌對象obj 2*10(兩個vector對象,里面各有10個obj對象)次。
//所以其結果是兩次構造函數(一次Obj(void),一次Obj(int x),另外20構造函數是調用Obj類的默認拷貝構造函數Obj(const Obj&),所有沒有輸出),22次析構函數。
}