問題:C++中的空類,默認(rèn)情況下會產(chǎn)生哪些類成員函數(shù)?
馬關(guān)網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)。
系統(tǒng)默認(rèn)的缺省構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))
系統(tǒng)默認(rèn)提供的析構(gòu)函數(shù).
系統(tǒng)默認(rèn)的運(yùn)算符重載函數(shù)(拷貝賦值函數(shù)):用于同類對象之間的賦值.
系統(tǒng)默認(rèn)的取值運(yùn)算:當(dāng)對類的對象進(jìn)行取地址(&)時會被調(diào)用.
1.構(gòu)造函數(shù)法和析構(gòu)函數(shù)存在的必要性和作用:
(1).構(gòu)造函數(shù)的必要性和作用(用構(gòu)造函數(shù)確保初始化):
解決同種類型的不同對象的初始化問題.
保證每個對象的數(shù)據(jù)成員都有合適的初始值。
(2).析構(gòu)函數(shù)的必要性和作用(用析構(gòu)函數(shù)確保清除):
回收內(nèi)存和資源,通常用于釋放在構(gòu)造函數(shù)或?qū)ο笊趦?nèi)獲取的資源。
當(dāng)對象超出它的定義范圍時,編譯器自動調(diào)用析構(gòu)函數(shù).
2.構(gòu)造函數(shù)和析構(gòu)函數(shù)的種類:
(1).一個類可以有多個構(gòu)造函數(shù)(即構(gòu)造函數(shù)的重載).
a. 缺省構(gòu)造函數(shù):不帶任何參數(shù)的構(gòu)造函數(shù).
當(dāng)編譯器需要創(chuàng)建一個對象而又不知任何細(xì)節(jié)時,缺省的構(gòu)造函數(shù)就顯得非常重要.在一個構(gòu)造類型中沒有構(gòu)造函數(shù)時,編譯器會自動創(chuàng)建一個,然而,一旦有其他的構(gòu)造函數(shù)之后就沒有缺省構(gòu)造函數(shù).
b. 重載的構(gòu)造函數(shù):帶參數(shù)的構(gòu)造函數(shù).
屬于類成員函數(shù)的重載,通過參數(shù)的個數(shù),類型和順序形成重載的條件.其中特殊情況是:
如果類中有其他的構(gòu)造函數(shù)的話,系統(tǒng)就不會提供默認(rèn)的缺省構(gòu)造函數(shù)以構(gòu)造對象.
如果類中構(gòu)造函數(shù)帶有默認(rèn)參數(shù)的話,防止出現(xiàn)重載二義性而出錯. 類中的構(gòu)造函數(shù)形成重載時,注意防止重載函數(shù)中存在隱式類型轉(zhuǎn)換而出現(xiàn)重載的二義性.
c. 拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù)):
分為系統(tǒng)提供默認(rèn)的復(fù)制構(gòu)造函數(shù)(即淺拷貝或者全盤拷貝),以及自定義的復(fù)制構(gòu)造函數(shù)(即深拷貝或者部分拷貝).
(2).一個類只有一個析構(gòu)函數(shù)(即析構(gòu)函數(shù)不存在重載),
析構(gòu)函數(shù)也分為系統(tǒng)默認(rèn)的和自定義的析構(gòu)函數(shù)(完成指定的其他功能).
3.關(guān)于拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))具體知識點(diǎn):
(1).定義格式:
類名 (類名+&對象)
{
}
特點(diǎn):無返回值,參數(shù)只有且只能是同類對象的引用.
解疑:為什么不允許定義這種形式 A(A copy) 的拷貝構(gòu)造函數(shù)?
這個拷貝構(gòu)造函數(shù)在參數(shù)傳遞的過程中又要調(diào)用拷貝構(gòu)造函數(shù)本身,而調(diào)用拷貝構(gòu)造函數(shù)時又要先進(jìn)行參數(shù)傳遞,參數(shù)傳遞又要調(diào)用拷貝構(gòu)造函數(shù)。。。。。。于是陷入不停的分配堆棧的無限遞歸中,而每次壓棧過程中又嵌套了壓棧,致使每一次的壓棧都不能完成,因此,編譯器通過不了這種形式的拷貝構(gòu)造函數(shù)。
(2).拷貝構(gòu)造函數(shù)和賦值運(yùn)算符重載的比較:
不同的地方:
a.拷貝構(gòu)造函數(shù)是在對象被創(chuàng)建并用另一個已經(jīng)存在的對象來初始化它時調(diào)用的;
如string s1 = "Hello World";
string s2 = s1; //等價于string s2(s1);
b.拷貝賦值函數(shù)只能把一個對象賦值給另一個已經(jīng)存在的對象,使得那個已經(jīng)存在的對象具有和源對象相同的狀態(tài)。
如 string s3;
s3 = s1;
相同的地方:
默認(rèn)的拷貝構(gòu)造函數(shù)和默認(rèn)的賦值運(yùn)算符重載均采用“按成員拷貝”默認(rèn)方式來實(shí)現(xiàn)。
以類String的兩個對象a、b為例。假設(shè)a.m_data的內(nèi)容為“Hello”,b.m_data的內(nèi)容為“world”?,F(xiàn)將a賦值給b,默認(rèn)賦值運(yùn)算符重載的“按成員拷貝”意味著執(zhí)行b.m_data=a.m_data。這將造成三個錯誤:
(1)b.m_data原持有的內(nèi)存沒有被釋放,造成內(nèi)存泄漏。
(2)b.m_data和a.m_data指向同一塊內(nèi)存區(qū)域,a或b任何一方變動都會影響另一方
(3)在對象被析構(gòu)時,m_data被delete了兩次。
4.構(gòu)造函數(shù)的初始化列表知識點(diǎn):
1).初始化列表的構(gòu)造順序:
初始化列表中個數(shù)據(jù)成員的構(gòu)造順序與其聲明的順序一致.而不是按照出現(xiàn)在初始化列表的順序相關(guān).
2.)必須使用初始化列表的情況?
引用(const)成員和reference類型的成員只能被初始化而不能在初始化列表外進(jìn)行賦值操作.
類的繼承中基類的構(gòu)造函數(shù)必須通過初始化列表來調(diào)用(先調(diào)用基類構(gòu)造函數(shù),然后才是自身的構(gòu)造函數(shù)).
類的聚合中聚合類的嵌套對象的構(gòu)造可以放在其構(gòu)造函數(shù)體內(nèi)進(jìn)行賦值而不必一定初始化才行,和普通的成員變量一致.
網(wǎng)站題目:C++6個默認(rèn)成員函數(shù)
分享路徑:http://www.rwnh.cn/article20/jeesco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、網(wǎng)站收錄、小程序開發(fā)、云服務(wù)器、軟件開發(fā)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)