目錄
一、構(gòu)造函數(shù)
二、析構(gòu)函數(shù)
三、賦值運算符
四、拷貝構(gòu)造
如果一個類中沒有成員,我們稱為空類。空類,也存在6個默認(rèn)的類成員函數(shù)。
默認(rèn)成員函數(shù):用戶不顯示地寫,編譯器會默認(rèn)生成的函數(shù)叫做默認(rèn)成員函數(shù)。
6個默認(rèn)成員函數(shù):
構(gòu)造函數(shù):完成對象初始化? ? ? ? ? ? ? ?析構(gòu)函數(shù):完成對象清理拷貝構(gòu)造:用同類對象構(gòu)造新類? ? ? ? 賦值重載:把一個對象賦給另一個對象
取地址重載:很少涉及
一、構(gòu)造函數(shù)
在C語言中,一個數(shù)據(jù)結(jié)構(gòu)的模擬首先要完成初始化,就拿棧舉例子:
初始化要確定top,確定開辟的空間,和數(shù)組的初始容量。如果沒有完成這一初始化會出現(xiàn)諸多問題,為了防止遺忘類的初始化,引入構(gòu)造函數(shù)。
在類的創(chuàng)建時,自動調(diào)用,用來進(jìn)行初始化。
1.特性:
1)名稱與類名相同,沒有返回值。
2)不是開空間創(chuàng)建對象,是在實例化后自動調(diào)用。
3)可以重載
拿日期類舉例子
.構(gòu)造函數(shù)可以是重載???重載要注意二義性
.關(guān)于重載的調(diào)用
在調(diào)用無參構(gòu)造函數(shù)時 不可寫成? Date d1();否則編譯器將認(rèn)為這是一個函數(shù)聲明。
.在函數(shù)重載中給缺省值
關(guān)于帶參函數(shù)給全缺省,那么它與無參構(gòu)造函數(shù)都為默認(rèn)構(gòu)造函數(shù),不需要用戶顯示調(diào)用,編譯器就能初始化。
默認(rèn)構(gòu)造函數(shù)只能出現(xiàn)一個,全缺省不能與無參構(gòu)造函數(shù)同時出現(xiàn)。
?在類中既有無參構(gòu)造函數(shù)和全缺省構(gòu)造函數(shù),編譯器能通過編譯 但在創(chuàng)建對象時會出現(xiàn)二義性,不知道調(diào)用哪個函數(shù),會出錯。
5)編譯器會生成默認(rèn)的構(gòu)造函數(shù)
如果用戶沒有自己顯示的實現(xiàn)一個構(gòu)造函數(shù),那么編譯器會生成一個無參的默認(rèn)構(gòu)造函數(shù)。
編譯器生成的默認(rèn)構(gòu)造函數(shù)特點:
內(nèi)置類型初始化為隨機值,自定義類型會調(diào)用其的構(gòu)造函數(shù)。
?類B的默認(rèn)構(gòu)造函數(shù)在初始化時aa時,會調(diào)用A的構(gòu)造函數(shù),而b初始化為隨機值。
6)初始化列表
?對于引用和const類型的對象,在定義時必須進(jìn)行初始化,而構(gòu)造函數(shù)的函數(shù)體為賦值語句,無法進(jìn)行初始化;
因此引入初始化列表,在對象創(chuàng)建時即完成初始化工作。
初始化列表:以一個冒號開始,接著是一個以逗號分隔的數(shù)據(jù)成員列表,每個"成員變量"后面跟
一個放在括號中的初始值或表達(dá)式
?注意:
每個成員在初始化列表只能出現(xiàn)一次;
引用和常對象,需要傳參的自定義類型必須在初始化列表中初始化;
初始化列表的初始化順序只與類對象聲明順序有關(guān);
二、析構(gòu)函數(shù)
在一個類對象結(jié)束,要進(jìn)行動態(tài)內(nèi)存的釋放。為了防止用戶遺忘,引入析構(gòu)函數(shù),在對象生命周期結(jié)束時,自動調(diào)用,完成對象的內(nèi)存清理工作。
?特性:
1)函數(shù)名為 類名前加~? (表示與構(gòu)造函數(shù)相對)
2)沒有參數(shù) ,沒有返回值
3)編譯器會生成默認(rèn)構(gòu)造函數(shù)
與構(gòu)造函數(shù)一樣,用戶沒有顯示寫析構(gòu)函數(shù)時,編譯器會自動生成析構(gòu)函數(shù)
內(nèi)置類型不做回收,自定義類型調(diào)用其的析構(gòu)函數(shù)。
4)調(diào)用順序類似棧結(jié)構(gòu),先創(chuàng)建的類,后調(diào)用析構(gòu)函數(shù)。
三、賦值運算符
C++為了增強代碼的可讀性,引入賦值運算符=
賦值運算是針對倆個已經(jīng)存在的類;
關(guān)鍵字:operator =? 有函數(shù)參數(shù)和返回值
?
特性:
1)在用戶不顯示寫時,編譯器會生成默認(rèn)賦值運算符,其的特點是淺拷貝
淺拷貝:將目標(biāo)一個字節(jié)一個字節(jié)的拷貝給目的地
涉及一塊空間的拷貝不能用淺拷貝:同一塊空間不能連續(xù)釋放兩次;因此用戶自定義賦值運算符重載就非常有必要。
2)返回值是T&,減少傳值的拷貝,可以連續(xù)拷貝? ?
? ? ?參數(shù)類型const T&? 防止被錯誤修改
3)隱藏第一個參數(shù)this指針? ,檢查拷貝的來源是否為自己
3)不可重載為全局函數(shù)
全局函數(shù)沒有this指針,需要傳所有參數(shù)
四、拷貝構(gòu)造
將已經(jīng)存在的類,拷貝給一個新類;
其是構(gòu)造函數(shù)的一個重載;
?在傳參時必須用引用接收參數(shù);
否則 不帶引用;會發(fā)生無限遞歸
要拷貝構(gòu)造就要傳參? 傳參就要調(diào)用拷貝構(gòu)造? 調(diào)用拷貝構(gòu)造就要傳參 ..........會發(fā)生無限遞歸
1)用戶不顯示寫時,編譯器會產(chǎn)生默認(rèn)拷貝構(gòu)造函數(shù),是淺拷貝;
在涉及動態(tài)空間時,必須顯示實現(xiàn)一個拷貝構(gòu)造函數(shù),否則會發(fā)生同一塊空間釋放倆次;
2)對象返回時,能返回引用,盡量返回引用,提高效率;
區(qū)別拷貝構(gòu)造和賦值的調(diào)用
?拷貝構(gòu)造是一個存在的類對象,賦值是倆個類都存在;
———————————————————————————————————————————文章來源:http://www.zghlxwxcb.cn/news/detail-625719.html
本期的C++默認(rèn)成員函數(shù)的介紹就到這。還有倆個默認(rèn)的成員函數(shù),但是基本上用不到 ,就不做介紹,對于構(gòu)造函數(shù)是重要的一項,希望本文對大家有所幫助!文章來源地址http://www.zghlxwxcb.cn/news/detail-625719.html
到了這里,關(guān)于再探C++——默認(rèn)成員函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!