類型轉(zhuǎn)換構(gòu)造函數(shù)與析構(gòu)函數(shù)

注:以下大部分內(nèi)容來源于 coursera 課程《C++程序設(shè)計(jì)》

類型轉(zhuǎn)換構(gòu)造函數(shù)

  1. 目的:實(shí)現(xiàn)類型的自動(dòng)轉(zhuǎn)換。
  2. 特點(diǎn):只有一個(gè)參數(shù);不是復(fù)制構(gòu)造函數(shù);被調(diào)用時(shí)會(huì)建立臨時(shí)的變量
class Complex{
public:double real,imag;
Complex(int i){ //類型轉(zhuǎn)換構(gòu)造函數(shù)(2)
cout<<"IntConstructor called"<<endl;
real = i;
imag = 0;
}
Complex(double r, double i){ //構(gòu)造函數(shù)(1)
real = r; 
imag = i;}
};
int main(){
Complex c1(7,8); //調(diào)用構(gòu)造函數(shù)(1)
Complex c2=12; //調(diào)用類型轉(zhuǎn)換構(gòu)造函數(shù)(2)
c1 = 9;//9被自動(dòng)轉(zhuǎn)換成一個(gè)臨時(shí)Complex對(duì)象
cout<<c1.real<<","<<c1.imag<<endl;
return 0;
}

Complex c2=12; 這個(gè)語句對(duì)c2進(jìn)行初始化,在初始化的過程中,調(diào)用類型轉(zhuǎn)換構(gòu)造函數(shù),它是不會(huì)去生成一個(gè)臨時(shí)的變量的,而只是把12那個(gè)參數(shù)傳入(2)。
c1 = 9是一個(gè)賦值語句,這里注意,賦值后的兩邊其實(shí)是不同類型的。c1 是complex 型,9是整型。在生成這個(gè)賦值語句的時(shí)候,編譯器會(huì)調(diào)用類型轉(zhuǎn)換構(gòu)造函數(shù),首先會(huì)生成一個(gè)臨時(shí)變量,9被自動(dòng)轉(zhuǎn)換成一個(gè)臨時(shí)Complex對(duì)象,然后將這個(gè)complex對(duì)象賦值給c1。

析構(gòu)函數(shù) Destructor

  1. 格式:在類前面加"~"
  2. 作用:在象消亡前做善后處理,例如釋放分配的空間等。
    3.對(duì)象消亡時(shí),自動(dòng)被調(diào)用。如果沒有寫,編譯器會(huì)自動(dòng)生成缺省析構(gòu)函數(shù)。
class String{
private: char *p;
public: 
String(){
p = new char[10];
}
~String(); 
};
String::~String(){
delete [] p ;
}
  1. 數(shù)組:對(duì)象數(shù)組將生命期結(jié)束時(shí),對(duì)象數(shù)組的每個(gè)元素的析構(gòu)函數(shù)都會(huì)被調(diào)用。
class Ctest{
public:
~Ctest(){cout<<"destructor called"<<endl;}
};
int main(){
Ctest array[2];
cout<<"End Main"<<endl;
return 0;
}
輸出:
End Main
destructor called
destructor called

定義了一個(gè)Ctest類下面的一個(gè)對(duì)象數(shù)組array, 它包含了兩個(gè)對(duì)象。
結(jié)束的時(shí)候, 我們就要釋放相應(yīng)的對(duì)象,會(huì)調(diào)用兩次析構(gòu)函數(shù)。

  1. delete 運(yùn)算符
    delete 運(yùn)算導(dǎo)致析構(gòu)函數(shù)調(diào)用
Ctest *pTest;
pTest = new Ctest; //構(gòu)造函數(shù)調(diào)用
delete pTest;//析構(gòu)函數(shù)調(diào)用
pTest = new Ctest[3]; //構(gòu)造函數(shù)調(diào)用
delete []pTest;//析構(gòu)函數(shù)調(diào)用

定義了一個(gè) Ctest的的一個(gè)指針, pTest,那么它指向誰呢?它指向了new出來的一個(gè)Ctest,

  1. 比較
構(gòu)造函數(shù) 析構(gòu)函數(shù)
成員函數(shù)的一種 成員函數(shù)的一種
名字與類型相同 名字與類型相同
可以有參數(shù),不能有返回值 沒有參數(shù)值和返回值
可以有多個(gè)構(gòu)造函數(shù) 一個(gè)類最多一個(gè)析構(gòu)函數(shù)
可以用來初始化,初始化不同對(duì)象需要多個(gè) 對(duì)對(duì)象消亡前做最后的善后處理,一個(gè)就足夠
  1. 例子
class Demo{
int id;
public:
Demo(int i){
id = i;
cout<<"id = "<< id<<"Constructed"<<endl;
}
~Demo(){
cout<<"id = "<< id<<"Destructed"<<endl;
}};
Demo d1(1); //定義了一個(gè)全局變量
void Func(){
static Demo d2(2); //靜態(tài)變量的消亡在程序結(jié)束之時(shí)
Demo d3(3);
cout<<"Func"<<endl;
}
int main(){
Demo d4(4);
d4 =6;  //類型轉(zhuǎn)換構(gòu)造函數(shù)
//生成一個(gè)臨時(shí)變量,并且析構(gòu)
cout<<"main"<<endl;
{Demo d5(5);} //作用域,離開作用域就會(huì)消亡
Func();//包含兩個(gè)變量,d2是靜態(tài)的,會(huì)在整個(gè)程序結(jié)束時(shí)消亡,d3直接消亡
cout<<"main ends"<<endl;
return 0;
}
輸出:
id = 1 Constructed
id = 4 Constructed
id = 6 Constructed
id = 6 Destructed
main
id = 5 Constructed
id = 5 Destructed
id = 2 Constructed
id = 3 Constructed
Func
id = 3 Destructed
main ends
id = 6 Destructed
id = 2 Destructed
id = 1 Destructed

最先構(gòu)造的會(huì)最后被消亡掉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容