C++中的六個(gè)函數(shù)
一、構(gòu)造函數(shù)
在C++中,構(gòu)造函數(shù)是六個(gè)函數(shù)中的第一個(gè),當(dāng)一個(gè)對(duì)象被創(chuàng)建時(shí),在它的整個(gè)周期中,是一個(gè)由生到死的過程,即構(gòu)造函數(shù)創(chuàng)建對(duì)象,析構(gòu)函數(shù)析構(gòu)對(duì)象。在對(duì)象被創(chuàng)建時(shí),調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)對(duì)象,這是對(duì)象的創(chuàng)建過程。在C++中,當(dāng)你創(chuàng)建一個(gè)對(duì)象時(shí)需要調(diào)用構(gòu)造函數(shù)創(chuàng)建對(duì)象,在類中,有默認(rèn)的構(gòu)造函數(shù),當(dāng)然你也可以去使用構(gòu)造函數(shù)去創(chuàng)建對(duì)象,對(duì)數(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ù)是無(wú)類型的,第一個(gè)構(gòu)造函數(shù)是默認(rèn)的構(gòu)造函數(shù),第二個(gè)構(gòu)造函數(shù)是只對(duì)一個(gè)數(shù)據(jù)成員進(jìn)行初始化,其它的數(shù)據(jù)成員是隨機(jī)值。第二個(gè)構(gòu)造函數(shù)是對(duì)兩個(gè)數(shù)據(jù)成員進(jìn)行初始化,其它的數(shù)據(jù)成員為隨機(jī)值。第三個(gè)構(gòu)造函數(shù)是對(duì)所有的數(shù)據(jù)成員進(jìn)行初始化。
二、析構(gòu)函數(shù)
在C++中,構(gòu)造函數(shù)是創(chuàng)建一個(gè)對(duì)象時(shí),那么析構(gòu)函數(shù)則是這個(gè)對(duì)象由生到死的死亡過程。同時(shí)析構(gòu)函數(shù)也在析構(gòu)對(duì)象時(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ù)如上所示,它無(wú)類型、無(wú)參數(shù)、無(wú)返回值,如果在構(gòu)造對(duì)象時(shí)沒有進(jìn)行空間的開辟內(nèi)存的分配時(shí),那么
析構(gòu)函數(shù)如同默認(rèn)的析構(gòu)函數(shù)一樣,如果進(jìn)行了內(nèi)存的分配時(shí),當(dāng)一個(gè)對(duì)象被析構(gòu)時(shí)同時(shí)還要對(duì)其所分配的內(nèi)存進(jìn)行回收,否則就會(huì)造成內(nèi)存泄漏。
三、拷貝構(gòu)造函數(shù)
在C++中,如果在構(gòu)造函數(shù)中有申請(qǐng)內(nèi)存的操作,且在其他函數(shù)中出現(xiàn)對(duì)象的拷貝,那么就會(huì)需要拷貝構(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)了對(duì)對(duì)象的拷貝賦值,那么就需要拷貝構(gòu)造函數(shù),如果沒有拷貝構(gòu)造函數(shù),則會(huì)使用默認(rèn)的
拷貝構(gòu)造函數(shù),那么此時(shí)進(jìn)行的是淺拷貝,那么會(huì)產(chǎn)生析構(gòu)函數(shù)對(duì)內(nèi)存重復(fù)釋放的錯(cuò)誤。那么此時(shí)就需要進(jìn)行深拷貝
操作,重新編寫拷貝構(gòu)造函數(shù)對(duì)對(duì)象進(jìn)行拷貝賦值。而在編寫拷貝構(gòu)造函數(shù)時(shí)要注意參數(shù)必須是“&”引用傳遞,否則
則是語(yǔ)法錯(cuò)誤。
四、賦值函數(shù)
在C++中,賦值函數(shù)為第四個(gè)函數(shù),如果在構(gòu)造函數(shù)中有申請(qǐng)內(nèi)存的操作,且在其他程序中有兩個(gè)對(duì)象直接或間接
進(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)行了對(duì)象的賦值操作,如果沒有對(duì)“=”運(yùn)算符進(jìn)行重載定義,則會(huì)產(chǎn)生兩次釋放同一個(gè)內(nèi)存的
操作的錯(cuò)誤。在“=”重載操作中,如果涉及到指針操作,則必須判斷兩個(gè)對(duì)象是否為同一個(gè)對(duì)象即自賦值操作,否則
當(dāng)進(jìn)行釋放指針的操作時(shí),就可能產(chǎn)生錯(cuò)誤。然后要用delete釋放原有的內(nèi)存資源,否則將造成內(nèi)存泄漏。
五、對(duì)一般對(duì)象的取址函數(shù)
在C++中,對(duì)一般對(duì)象的取址函數(shù)為第五個(gè)函數(shù)。
class Base { public: Base* operator&() { return this; } };
在一般對(duì)象的取址函數(shù)是直接返回該對(duì)象的地址,則為取其地址。
六、對(duì)常對(duì)象的取址函數(shù)
在C++中,對(duì)常對(duì)象的取址函數(shù)為第六個(gè)函數(shù)。
class Base { public: const Base* operator&() const { return this; } };
在常對(duì)象的取址函數(shù)也是直接返回該常對(duì)象的地址,則為取其地址。
- C語(yǔ)言切割多層字符串(strtok_r strtok使用方法)
- C++中strtok()函數(shù)的用法介紹
- PHP strtok()函數(shù)的優(yōu)點(diǎn)分析
- C++中sort函數(shù)的基礎(chǔ)入門使用教程
- 詳解C++調(diào)用Python腳本中的函數(shù)的實(shí)例代碼
- C++函數(shù)指針和回調(diào)函數(shù)使用解析
- node.js調(diào)用C++函數(shù)的方法示例
- c/c++ 標(biāo)準(zhǔn)庫(kù) bind 函數(shù)詳解
- C++根據(jù)傳入的函數(shù)指針來解析需要的參數(shù)(推薦)
- strtok函數(shù)的使用示例
相關(guān)文章
C語(yǔ)言簡(jiǎn)易實(shí)現(xiàn)掃雷小游戲
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言簡(jiǎn)易實(shí)現(xiàn)掃雷小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10基于opencv實(shí)現(xiàn)視頻中的顏色識(shí)別功能
這篇文章主要介紹了基于opencv實(shí)現(xiàn)視頻中的顏色識(shí)別功能,文章詳細(xì)介紹了顏色識(shí)別的原理及opencv中的顏色模型,基于c++代碼實(shí)現(xiàn)顏色識(shí)別功能,需要的朋友可以參考下2022-07-07C語(yǔ)言實(shí)現(xiàn)電話簿項(xiàng)目管理
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)電話簿項(xiàng)目管理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-07-07C++控制權(quán)限關(guān)鍵字protected
這篇文章主要介紹了C++控制權(quán)限關(guān)鍵字protected,protected和private類似,而對(duì)于派生類來說,protected與public類似,下面來一起倆姐更多詳細(xì)內(nèi)容吧,需要的小伙伴可以參考一下2022-01-01vscode搭建STM32開發(fā)環(huán)境的詳細(xì)過程
這篇文章主要介紹了vscode搭建STM32開發(fā)環(huán)境的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05