C\C++ 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(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次析構函數。
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM