2. 構(gòu)造函數(shù) 2.1概念如果一個(gè)類(lèi)中什么成員都沒(méi)有,簡(jiǎn)稱(chēng)為空類(lèi)
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括思禮網(wǎng)站建設(shè)、思禮網(wǎng)站制作、思禮網(wǎng)頁(yè)制作以及思禮網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專(zhuān)注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,思禮網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到思禮省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!空類(lèi)并不是說(shuō)里面什么都沒(méi)有:任何類(lèi)在什么都不寫(xiě)時(shí),編譯器會(huì)自動(dòng)生成以下6個(gè)默認(rèn)成員函數(shù)。
默認(rèn)成員函數(shù):用戶沒(méi)有顯式實(shí)現(xiàn),編譯器會(huì)生成的成員函數(shù)稱(chēng)為默認(rèn)成員函數(shù)
class A{};
2.2 特性構(gòu)造函數(shù)是一個(gè)特殊的成員函數(shù),名字與類(lèi)名相同,創(chuàng)建類(lèi)類(lèi)型對(duì)象時(shí)由編譯器自動(dòng)調(diào)用,以保證每個(gè)數(shù)據(jù)成員都有 一個(gè)合適的初始值,并且在對(duì)象整個(gè)生命周期內(nèi)只調(diào)用一次
3. 析構(gòu)函數(shù) 3.1概念構(gòu)造函數(shù)是特殊的成員函數(shù),需要注意的是,構(gòu)造函數(shù)雖然名字叫構(gòu)造,但是構(gòu)造函數(shù)的主要任務(wù)并不是開(kāi)空間創(chuàng)建對(duì)象,而是初始化對(duì)象
特點(diǎn):
- 函數(shù)名與類(lèi)名相同
- 無(wú)返回值
- 對(duì)象實(shí)例化時(shí),編譯器自動(dòng)調(diào)用對(duì)應(yīng)的構(gòu)造函數(shù)
- 構(gòu)造函數(shù)可以重載
class Date { public: Date() {}//無(wú)參的默認(rèn)構(gòu)造 Date(int year, int mouth, int day) { _year = year; _mouth = mouth; _day = day; }//帶參數(shù)的構(gòu)造函數(shù) private: int _year; int _mouth; int _day; }; void TestDate() { Date d1; // 調(diào)用無(wú)參構(gòu)造函數(shù) Date d2(2015, 1, 1); // 調(diào)用帶參的構(gòu)造函數(shù) // 注意:如果通過(guò)無(wú)參構(gòu)造函數(shù)創(chuàng)建對(duì)象時(shí),對(duì)象后面不用跟括號(hào),否則就成了函數(shù)聲明 // 以下代碼的函數(shù):聲明了d3函數(shù),該函數(shù)無(wú)參,返回一個(gè)日期類(lèi)型的對(duì)象 // warning C4930: “Date d3(void)”: 未調(diào)用原型函數(shù)(是否是有意用變量定義的?) Date d3();//這是聲明不是創(chuàng)建對(duì)象 }
- 如果類(lèi)中沒(méi)有顯式定義構(gòu)造函數(shù),則C++編譯器會(huì)自動(dòng)生成一個(gè)無(wú)參的默認(rèn)構(gòu)造函數(shù),一旦用戶顯式定義編譯器將不再生成
class Date { public: //Date(int year, int mouth, int day) //{ // _year = year; // _mouth = mouth; // _day = day; //} void Print() { cout<< _year<< "-"<< _month<< "-"<< _day<< endl; } private: int _year; int _mouth; int _day; }; int main() { Date d1; // 將Date類(lèi)中構(gòu)造函數(shù)屏蔽后,代碼可以通過(guò)編譯,因?yàn)榫幾g器生成了一個(gè)無(wú)參的默認(rèn)構(gòu)造函數(shù) // 將Date類(lèi)中構(gòu)造函數(shù)放開(kāi),代碼編譯失敗,因?yàn)橐坏╋@式定義任何構(gòu)造函數(shù),編譯器將不再生成無(wú)參構(gòu)造函數(shù),放開(kāi)后報(bào)錯(cuò):error C2512: “Date”: 沒(méi)有合適的默認(rèn)構(gòu)造函數(shù)可用 return 0; }
C++把類(lèi)型分成內(nèi)置類(lèi)型(基本類(lèi)型)和自定義類(lèi)型。內(nèi)置類(lèi)型就是語(yǔ)言提供的數(shù)據(jù)類(lèi)型,如:
int/char…,自定義類(lèi)型就是我們使用class/struct/union等自己定義的類(lèi)型 ,編譯器**生成默認(rèn)的構(gòu)造函數(shù)會(huì)對(duì)自定類(lèi)型成員調(diào)用的它的默認(rèn)構(gòu)造函數(shù),自定義類(lèi)型不處理**注意:C++11 中針對(duì)內(nèi)置類(lèi)型成員不初始化的缺陷,又打了補(bǔ)丁,即:內(nèi)置類(lèi)型成員變量在類(lèi)中聲明時(shí)可以給默認(rèn)值(也就是缺省值)
無(wú)參的構(gòu)造函數(shù)和全缺省的構(gòu)造函數(shù)都稱(chēng)為默認(rèn)構(gòu)造函數(shù),并且默認(rèn)構(gòu)造函數(shù)只能有一個(gè)。注意:無(wú)參構(gòu)造函數(shù)、全缺省構(gòu)造函數(shù)、我們沒(méi)寫(xiě)編譯器默認(rèn)生成的構(gòu)造函數(shù),都可以認(rèn)為是默認(rèn)構(gòu)造函數(shù)。
3.2 特性析構(gòu)函數(shù):與構(gòu)造函數(shù)功能恰巧相反,析構(gòu)函數(shù)不是完成對(duì)對(duì)象本身的銷(xiāo)毀,局部對(duì)象銷(xiāo)毀工作是由編譯器完成的。而對(duì)象在銷(xiāo)毀時(shí)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),完成對(duì)象中資源的清理工作
4.拷貝構(gòu)造函數(shù) 4.1 概念構(gòu)造函數(shù)是特殊的成員函數(shù),其特征如下:
析構(gòu)函數(shù)是在類(lèi)名前面加上字符~
無(wú)參數(shù)無(wú)返回值類(lèi)型
一個(gè)類(lèi)只能有一個(gè)析構(gòu)函數(shù),若未顯式定義,系統(tǒng)會(huì)自動(dòng)生成默認(rèn)的析構(gòu)函數(shù),注意:析構(gòu)函數(shù)不能重載
對(duì)象生命周期結(jié)束時(shí),C++編譯器自動(dòng)調(diào)用析構(gòu)函數(shù)
關(guān)于編譯器自動(dòng)生成的析構(gòu)函數(shù),是否會(huì)完成一些事情呢?下面的程序我們會(huì)看到,編譯器生成的默認(rèn)析構(gòu)函數(shù),對(duì)自定類(lèi)型成員調(diào)用它的析構(gòu)函數(shù)。
如果==類(lèi)中沒(méi)有申請(qǐng)資源時(shí),析構(gòu)函數(shù)可以不寫(xiě)(它是回收資源的)==,直接使用編譯器生成的默認(rèn)析構(gòu)函數(shù),比如Date類(lèi);有資源申請(qǐng)時(shí),一定要寫(xiě),否則會(huì)造成資源泄漏,比如Stack類(lèi)
4.2 特征拷貝構(gòu)造函數(shù):只有單個(gè)形參,該形參是對(duì)本類(lèi)類(lèi)型對(duì)象的引用(一般常用const修飾),在用已存在的類(lèi)類(lèi)型對(duì)象創(chuàng)建新對(duì)象時(shí)由編譯器自動(dòng)調(diào)用。
5.賦值運(yùn)算符重載 5.1 運(yùn)算符重載
拷貝構(gòu)造函數(shù)是構(gòu)造函數(shù)的一個(gè)重載形式
拷貝構(gòu)造函數(shù)的**參數(shù)只有一個(gè)且必須是類(lèi)類(lèi)型對(duì)象的引用,使用傳值方式編譯器直接報(bào)錯(cuò),**因?yàn)闀?huì)引發(fā)無(wú)窮遞歸調(diào)用。(因?yàn)樾螀鬟f給函數(shù)是拷貝構(gòu)造,寫(xiě)拷貝構(gòu)造去調(diào)用拷貝構(gòu)造就會(huì)引起無(wú)窮遞歸
class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } // Date(const Date& d) // 正確寫(xiě)法 Date(const Date d) // 錯(cuò)誤寫(xiě)法:編譯報(bào)錯(cuò),會(huì)引發(fā)無(wú)窮遞歸 { _year = d._year; _month = d._month; _day = d._day; } private: int _year; int _month; int _day; };.**若未顯示定義,編譯器會(huì)生成默認(rèn)的拷貝構(gòu)造。**默認(rèn)的拷貝構(gòu)造函數(shù)對(duì)象會(huì)按內(nèi)存存儲(chǔ)按字節(jié)序完成拷貝,這種拷貝叫做淺拷貝,或者值拷貝
注意:在編譯器生成的默認(rèn)拷貝構(gòu)造函數(shù)中,內(nèi)置類(lèi)型是按照字節(jié)方式直接拷貝的,而**自定義類(lèi)型是調(diào)用其拷貝構(gòu)造函數(shù)完成拷貝的 **
編譯器生成的默認(rèn)拷貝構(gòu)造函數(shù)已經(jīng)可以完成字節(jié)序的值拷貝了, 還需要自己顯式實(shí)現(xiàn)嗎?當(dāng)然
注意:類(lèi)中如果沒(méi)有涉及資源申請(qǐng)時(shí),拷貝構(gòu)造函數(shù)是否寫(xiě)都可以;一旦涉及到資源申請(qǐng)時(shí),則拷貝構(gòu)造函數(shù)是一定要寫(xiě)的,否則就是淺拷貝。 就會(huì)出現(xiàn)倆個(gè)類(lèi)指向同一塊資源,調(diào)用析構(gòu)函數(shù)的時(shí)候,析構(gòu)函數(shù)可以能就會(huì)析構(gòu)兩次,引發(fā)問(wèn)題
拷貝構(gòu)造調(diào)用場(chǎng)景:
- 使用已存在對(duì)象創(chuàng)建新對(duì)象
- 函數(shù)參數(shù)類(lèi)型為類(lèi)類(lèi)型對(duì)象
- 函數(shù)返回值類(lèi)型為類(lèi)類(lèi)型對(duì)象
為了提高程序效率,一般對(duì)象傳參時(shí),盡量使用引用類(lèi)型,返回時(shí)根據(jù)實(shí)際場(chǎng)景,能用引用盡量使用引用。
5.2 賦值運(yùn)算符重載C++為了增強(qiáng)代碼的可讀性引入了運(yùn)算符重載,運(yùn)算符重載是具有特殊函數(shù)名的函數(shù),也具有其返回值類(lèi)型,函數(shù)名字以及參數(shù)列表,其返回值類(lèi)型與參數(shù)列表與普通的函數(shù)類(lèi)似。
函數(shù)名字為:關(guān)鍵字operator后面接需要重載的運(yùn)算符符號(hào)。
函數(shù)原型:**返回值類(lèi)型 operator操作符(參數(shù)列表) **注意:
- 不能通過(guò)連接其他符號(hào)來(lái)創(chuàng)建新的操作符:比如operator@
- 重載操作符必須有一個(gè)類(lèi)類(lèi)型參數(shù)
- 用于內(nèi)置類(lèi)型的運(yùn)算符,其含義不能改變,例如:內(nèi)置的整型+,不 能改變其含義
- 作為類(lèi)成員函數(shù)重載時(shí),其形參看起來(lái)比操作數(shù)數(shù)目少1,因?yàn)槌蓡T函數(shù)的第一個(gè)參數(shù)為隱藏的this
.* :: sizeof ?: .注意以上5個(gè)運(yùn)算符不能重載。
- 賦值運(yùn)算符重載格式
- 參數(shù)類(lèi)型:const T&,傳遞引用可以提高傳參效率
- 返回值類(lèi)型:T&,返回引用可以提高返回的效率,有返回值目的是為了支持連續(xù)賦值
- 檢測(cè)是否自己給自己賦值
- 返回*this :要復(fù)合連續(xù)賦值的含義
- 賦值運(yùn)算符只能重載成類(lèi)的成員函數(shù)不能重載成全局函數(shù)
原因:賦值運(yùn)算符如果不顯式實(shí)現(xiàn),編譯器會(huì)生成一個(gè)默認(rèn)的。此時(shí)用戶再在類(lèi)外自己實(shí)現(xiàn)一個(gè)全局的賦值運(yùn)算符重載,就和編譯器在類(lèi)中生成的默認(rèn)賦值運(yùn)算符重載沖突了,故賦值運(yùn)算符重載只能是類(lèi)的成員函數(shù)。
5.3 前置++和后置++重載
用戶沒(méi)有顯式實(shí)現(xiàn)時(shí),編譯器會(huì)生成一個(gè)默認(rèn)賦值運(yùn)算符重載,以值的方式逐字節(jié)拷貝。注意:內(nèi)置類(lèi)型成員變量是直接賦值的,而自定義類(lèi)型成員變量需要調(diào)用對(duì)應(yīng)類(lèi)的賦值運(yùn)算符重載完成賦值。 (和拷貝構(gòu)造一個(gè)意思,如果有資源的申請(qǐng)就必須要實(shí)現(xiàn)深拷貝,不然會(huì)出問(wèn)題)
如果類(lèi)中未涉及到資源管理,賦值運(yùn)算符是否實(shí)現(xiàn)都可以;一旦涉及到資源管理則必須要實(shí)現(xiàn)
7.const成員class Date { public: Date(int year = 1900, int month = 1, int day = 1) { _year = year; _month = month; _day = day; } // 前置++:返回+1之后的結(jié)果 // 注意:this指向的對(duì)象函數(shù)結(jié)束后不會(huì)銷(xiāo)毀,故以引用方式返回提高效率 Date& operator++() { _day += 1; return *this; } // 后置++: // 前置++和后置++都是一元運(yùn)算符,為了讓前置++與后置++形成能正確重載 // C++規(guī)定:后置++重載時(shí)多增加一個(gè)int類(lèi)型的參數(shù),但調(diào)用函數(shù)時(shí)該參數(shù)不用傳遞,編譯器自動(dòng)傳遞 // 注意:后置++是先使用后+1,因此需要返回+1之前的舊值,故需在實(shí)現(xiàn)時(shí)需要先將this保存一份,然后給this + 1 // 而temp是臨時(shí)對(duì)象,因此只能以值的方式返回,不能返回引用 Date operator++(int) { Date temp(*this); _day += 1; return temp; } void print() { cout<< _year<< " "<< _month<< " "<< _day<< endl; } private: int _year; int _month; int _day; }; int main() { Date d; Date d1(2022, 1, 13); d = d1++; // d: 2022,1,13 d1:2022,1,14 d.print(); d1.print(); d = ++d1; // d: 2022,1,15 d1:2022,1,15 d.print(); d1.print(); return 0; }
將const修飾的“成員函數(shù)”稱(chēng)之為const成員函數(shù),const修飾類(lèi)成員函數(shù),實(shí)際修飾該成員函數(shù)隱含的this指針,表明在該成員函數(shù)中不能對(duì)類(lèi)的任何成員進(jìn)行修改

class Date { public : Date* operator&() { return this ; } const Date* operator&()const { return this ; } private : int _year ; // 年 int _month ; // 月 int _day ; // 日 };這兩個(gè)運(yùn)算符一般不需要重載,使用編譯器生成的默認(rèn)取地址的重載即可,只有特殊情況,才需要重載,比如想讓別人獲取到指定的內(nèi)容
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
分享題目:類(lèi)和對(duì)象中-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://chinadenli.net/article30/ceecso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、電子商務(wù)、響應(yīng)式網(wǎng)站、網(wǎng)站維護(hù)、網(wǎng)站改版、網(wǎng)頁(yè)設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容