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