1.前言 大部分對(duì)象在使用之之后沒有正確的從內(nèi)存清理完畢,造成內(nèi)存泄露也是C++出錯(cuò)的主要領(lǐng)域 引入類的析構(gòu)是正確的從內(nèi)存中清量類的對(duì)象 一般什么時(shí)候觸發(fā)并調(diào)用類的析構(gòu)函數(shù)呢? 答案是:當(dāng)類實(shí)例對(duì)象超出它的有效作用域時(shí),也就是撤消類對(duì)象時(shí),自動(dòng)調(diào)用析構(gòu)函數(shù)來清理對(duì)象 構(gòu)造函數(shù)用來初始化成員,析造函數(shù)則是用來清理對(duì)象 如我們刪除一個(gè)類的指針對(duì)象,則自動(dòng)調(diào)用析構(gòu)函數(shù): sales_item是一個(gè)類 sales_item *p = new sales_item //建立并分配一個(gè)類的指針p delete p;//這就是撤消類的對(duì)象,隨后它自動(dòng)調(diào)用析構(gòu)函數(shù) 2.定義 構(gòu)造函數(shù)名和類名完全一樣,并在名字前面加"~"符號(hào) 每個(gè)類只有一個(gè)析構(gòu)函數(shù) 2.1定義格式 ~析構(gòu)函數(shù)名稱(){} //一般析構(gòu)函數(shù): virtual ~析構(gòu)函數(shù)名稱(){} //虛析構(gòu)函數(shù): 代碼如下 class item{ public: ~item(){} }; 3 基類與派生類 3.1一般基類是不用寫出析構(gòu)函數(shù),編譯器自動(dòng)添加一個(gè) 類aa可以正常的工作就是編譯器自動(dòng)添加了四個(gè)函數(shù) 如代碼 class aa{ public: //構(gòu)造,析構(gòu),復(fù)制構(gòu)造,賦值操作符四個(gè)函數(shù)由編譯器自動(dòng)添加 int getx(){return x;} void set(int a){x=a;} private: int x; };
3.2析構(gòu)函數(shù)"三法則",如果類中有復(fù)制構(gòu)造函數(shù)和賦值操作符重載,則析構(gòu)函數(shù)必須要,三者缺一不可 class bb{ public: bb(const bb& rhs){...} //復(fù)制構(gòu)造函數(shù) bb& operator=(const bb& rhs){...} //賦值操作符 ~bb(){清理函數(shù)} //析構(gòu)函數(shù) private: int x }; 以上三個(gè)函數(shù)三者必須同時(shí)出現(xiàn),以免出現(xiàn)有的對(duì)象清除不了,有的出現(xiàn)"淺復(fù)制錯(cuò)誤"
3.3如果類中有指針成員,則必須專門寫一個(gè)析構(gòu)函數(shù)來清理指針成員,編譯器默認(rèn)添加的析構(gòu)函數(shù)不會(huì)去清理指針對(duì)象 如果類中有指針成員,如鏈表結(jié)構(gòu)實(shí)現(xiàn)等, 指針成員是基本單位,在方便使用指針的同時(shí),如何管理好它們的工作就是C++中最困難的部分
這個(gè)析構(gòu)函數(shù)最好特別定制,做法是析構(gòu)函數(shù)加一個(gè)清理函數(shù),析構(gòu)函數(shù)直接調(diào)用它就OK
3.4派生類 虛成員函數(shù)和虛析構(gòu)函數(shù)通常是成對(duì)出現(xiàn) 當(dāng)基類有虛函數(shù)時(shí),派生類會(huì)發(fā)生動(dòng)態(tài)調(diào)用,也就是動(dòng)態(tài)綁定, 當(dāng)不知道是調(diào)用基類對(duì)象還是調(diào)用派生類對(duì)象時(shí),還要正確的清理它們就更加困難啦,在基類引入虛析構(gòu)函數(shù)后, 它也能發(fā)生動(dòng)態(tài)綁定,正確的清理對(duì)象,這些都要到程序運(yùn)行后才能知道調(diào)用對(duì)象,在編譯前是無法知道對(duì)象是誰的 代碼: //基類 class base{ public: virtual draw(){}; //虛方法 virtual ~base(){};//虛析構(gòu)函數(shù) };
//派生類 class dev : public base{ public: draw(){}//draw方法的實(shí)現(xiàn) ~dev(){}//析構(gòu)函數(shù) };
4.設(shè)計(jì)指導(dǎo) 4.1一般的類我們不需要設(shè)計(jì)出它的析構(gòu)函數(shù),編譯器自動(dòng)為我們構(gòu)建一個(gè)析構(gòu)函數(shù) 4.2析構(gòu)函數(shù)"三法則",如果類中有復(fù)制構(gòu)造函數(shù)和賦值操作符重載,則析構(gòu)函數(shù)必須要,三者缺一不可 4.3如果類中有指針成員,則必須專門寫一個(gè)析構(gòu)函數(shù)來清理指針成員,編譯器默認(rèn)添加的析構(gòu)函數(shù)不會(huì)去清理指針對(duì)象 4.4"虛函數(shù)和虛析構(gòu)函數(shù)成對(duì)實(shí)現(xiàn)", 當(dāng)類中有虛成員時(shí),定制虛析構(gòu)函數(shù),讓派生類實(shí)行動(dòng)態(tài)綁定方式來清除基類對(duì)象或者派生類對(duì)象
|