C++中的六個(gè)函數(shù)
一、構(gòu)造函數(shù)
在C++中,構(gòu)造函數(shù)是六個(gè)函數(shù)中的第一個(gè),當(dāng)一個(gè)對象被創(chuàng)建時(shí),在它的整個(gè)周期中,是一個(gè)由生到死的過程,即構(gòu)造函數(shù)創(chuàng)建對象,析構(gòu)函數(shù)析構(gòu)對象。在對象被創(chuàng)建時(shí),調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)對象,這是對象的創(chuàng)建過程。在C++中,當(dāng)你創(chuàng)建一個(gè)對象時(shí)需要調(diào)用構(gòu)造函數(shù)創(chuàng)建對象,在類中,有默認(rèn)的構(gòu)造函數(shù),當(dāng)然你也可以去使用構(gòu)造函數(shù)去創(chuàng)建對象,對數(shù)據(jù)進(jìn)行初始化??聪旅娴睦樱?/p>
class Base { public: Base() {} Base(int a=0):num(a) {} Base(int a=0,int b=0):num(a),age(b) {} Base(int a=0,int b=0,double c=0.0):num(a),age(b),slaroy(c) {} private: int num; int age; double slaroy; };
在上面的構(gòu)造函數(shù)中,構(gòu)造函數(shù)必須與類名相同,構(gòu)造函數(shù)是無類型的,第一個(gè)構(gòu)造函數(shù)是默認(rèn)的構(gòu)造函數(shù),第二個(gè)構(gòu)造函數(shù)是只對一個(gè)數(shù)據(jù)成員進(jìn)行初始化,其它的數(shù)據(jù)成員是隨機(jī)值。第二個(gè)構(gòu)造函數(shù)是對兩個(gè)數(shù)據(jù)成員進(jìn)行初始化,其它的數(shù)據(jù)成員為隨機(jī)值。第三個(gè)構(gòu)造函數(shù)是對所有的數(shù)據(jù)成員進(jìn)行初始化。
二、析構(gòu)函數(shù)
在C++中,構(gòu)造函數(shù)是創(chuàng)建一個(gè)對象時(shí),那么析構(gòu)函數(shù)則是這個(gè)對象由生到死的死亡過程。同時(shí)析構(gòu)函數(shù)也在析構(gòu)對象時(shí)可以將已經(jīng)分配的內(nèi)存空間進(jìn)行回收。
class Base { public: Base() {} Base() { p= new char[strlen("default")+1]; strcpy(p,"default"); } ~Base() { if(p != NULL) { delete[] p; p=NULL; } } private: char *p; };
析構(gòu)函數(shù)如上所示,它無類型、無參數(shù)、無返回值,如果在構(gòu)造對象時(shí)沒有進(jìn)行空間的開辟內(nèi)存的分配時(shí),那么
析構(gòu)函數(shù)如同默認(rèn)的析構(gòu)函數(shù)一樣,如果進(jìn)行了內(nèi)存的分配時(shí),當(dāng)一個(gè)對象被析構(gòu)時(shí)同時(shí)還要對其所分配的內(nèi)存進(jìn)行回收,否則就會造成內(nèi)存泄漏。
三、拷貝構(gòu)造函數(shù)
在C++中,如果在構(gòu)造函數(shù)中有申請內(nèi)存的操作,且在其他函數(shù)中出現(xiàn)對象的拷貝,那么就會需要拷貝構(gòu)造函數(shù)。
class Base { public: Base() {} Base() { p= new char[strlen("default")+1]; strcpy(p,"default"); } Base(const Base &s) { p= new char[strlen(s.p)+1]; strcpy(p,s.p); } ~Base() { if(p != NULL) { delete[] p; p=NULL; } } private: char *p; }; int main() { Base a; Base b(a); return 0; }
由于在主函數(shù)中出現(xiàn)了對對象的拷貝賦值,那么就需要拷貝構(gòu)造函數(shù),如果沒有拷貝構(gòu)造函數(shù),則會使用默認(rèn)的
拷貝構(gòu)造函數(shù),那么此時(shí)進(jìn)行的是淺拷貝,那么會產(chǎn)生析構(gòu)函數(shù)對內(nèi)存重復(fù)釋放的錯(cuò)誤。那么此時(shí)就需要進(jìn)行深拷貝
操作,重新編寫拷貝構(gòu)造函數(shù)對對象進(jìn)行拷貝賦值。而在編寫拷貝構(gòu)造函數(shù)時(shí)要注意參數(shù)必須是“&”引用傳遞,否則
則是語法錯(cuò)誤。
四、賦值函數(shù)
在C++中,賦值函數(shù)為第四個(gè)函數(shù),如果在構(gòu)造函數(shù)中有申請內(nèi)存的操作,且在其他程序中有兩個(gè)對象直接或間接
進(jìn)行賦值操作,就需要賦值函數(shù)。
class Base { public: Base() {} Base() { p= new char[strlen("default")+1]; strcpy(p,"default"); } Base(const Base &s) { p= new char[strlen(s.p)+1]; strcpy(p,s.p); } Base& operator=(const Base &s) { if(&s==this) return *this; delete[] p; p= new char[strlen(s.p)+1]; strcpy(p,s.p); return *this; } ~Base() { if(p != NULL) { delete[] p; p=NULL; } } private: char *p; }; int main() { Base a,c; Base b(a); c=a; return 0; }
由于在主函數(shù)中進(jìn)行了對象的賦值操作,如果沒有對“=”運(yùn)算符進(jìn)行重載定義,則會產(chǎn)生兩次釋放同一個(gè)內(nèi)存的
操作的錯(cuò)誤。在“=”重載操作中,如果涉及到指針操作,則必須判斷兩個(gè)對象是否為同一個(gè)對象即自賦值操作,否則
當(dāng)進(jìn)行釋放指針的操作時(shí),就可能產(chǎn)生錯(cuò)誤。然后要用delete釋放原有的內(nèi)存資源,否則將造成內(nèi)存泄漏。
五、對一般對象的取址函數(shù)
在C++中,對一般對象的取址函數(shù)為第五個(gè)函數(shù)。
class Base { public: Base* operator&() { return this; } };
在一般對象的取址函數(shù)是直接返回該對象的地址,則為取其地址。
六、對常對象的取址函數(shù)
在C++中,對常對象的取址函數(shù)為第六個(gè)函數(shù)。
class Base { public: const Base* operator&() const { return this; } };
在常對象的取址函數(shù)也是直接返回該常對象的地址,則為取其地址。
上一篇:C++中異常機(jī)制的實(shí)現(xiàn)機(jī)制詳解
欄 目:C語言
下一篇:visual studio 建立dll類型工程、控制臺程序
本文標(biāo)題:C++中的六個(gè)函數(shù)
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/780.html
您可能感興趣的文章
- 04-02c語言沒有round函數(shù) round c語言
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實(shí)現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10用C++實(shí)現(xiàn)DBSCAN聚類算法
- 01-10全排列算法的非遞歸實(shí)現(xiàn)與遞歸實(shí)現(xiàn)的方法(C++)
- 01-10C++大數(shù)模板(推薦)
- 01-10淺談C/C++中的static與extern關(guān)鍵字的使用詳解


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置