賦值函數剖析
時間:2017-01-04作者:華清遠見
構(gou)造函(han)(han)(han)數(shu),拷貝構(gou)造函(han)(han)(han)數(shu),賦值函(han)(han)(han)數(shu)和析(xi)構(gou)函(han)(han)(han)數(shu)是C++類(lei)中基本的(de)(de)四大函(han)(han)(han)數(shu)。當(dang)設計(ji)一個(ge)類(lei)時,要(yao)首先考(kao)慮這四大函(han)(han)(han)數(shu)的(de)(de)寫法。若(ruo)沒有提供顯式的(de)(de)實現,編譯(yi)器會產生默(mo)認(ren)的(de)(de)函(han)(han)(han)數(shu)。若(ruo)類(lei)中有指(zhi)針成員,必(bi)須提供這四大函(han)(han)(han)數(shu)的(de)(de)實現,否(fou)則容易出現內(nei)存錯誤(wu)。本文針對賦值函(han)(han)(han)數(shu)進行了(le)分析(xi),包括其原型(xing),調(diao)用場合,存在的(de)(de)必(bi)要(yao)性(xing)等方面(mian)。 1. 賦值函數原型 A& operator =( const A& other) { … … } 2. 調用場合
A a1(10); // 為a1調用構造函數 3.考察: 1) 為何首先檢查同一性? 答:為了防止(zhi)自(zi)賦(fu)值(zhi) 2) (a=b)=c或者a=(b=c)是(shi)否(fou)合法 答:合法 3) 若定義(yi)為(wei)void operator =(const A &a) 有何局限? 答(da):沒有了返回值,就(jiu)不能(neng)實現a=b=c 這樣的鏈式復值。用(yong)法(fa)不夠靈活。 4) 賦值函數存(cun)在的必要性 答:以類String的(de)兩個(ge)對象(xiang)a,b為例,假(jia)設a.m_data的(de)內(nei)(nei)容為“hello”,b.m_data的(de)內(nei)(nei)容為“world”。現將a賦(fu)給b,缺省賦(fu)值函數的(de)“位(wei)拷貝”意味著執行b.m_data = a.m_data。這將造(zao)成(cheng)三(san)個(ge)錯(cuo)誤:一(yi)(yi)(yi)是(shi)b.m_data原有的(de)內(nei)(nei)存(cun)沒被(bei)釋放(fang),造(zao)成(cheng)內(nei)(nei)存(cun)泄露;二是(shi)b.m_data和a.m_data指向同一(yi)(yi)(yi)塊內(nei)(nei)存(cun),a或b任(ren)何一(yi)(yi)(yi)方(fang)變動都會影(ying)響另(ling)一(yi)(yi)(yi)方(fang);三(san)是(shi)在對象(xiang)被(bei)析構時,m_data被(bei)釋放(fang)了兩次(ci)。 5) 若定義為(wei)A operator =(const A &a){...return *this;},有何(he)局限? 答:若返回值改成(cheng)了不是(shi)引用類型,則有(you)兩個局限。 第(di)一:對于a=(b=c), 操作仍然(ran)可以(yi)正常進行,但效率降低了。 因為此時的(de)賦值函數會(hui)產生一(yi)個臨時對(dui)象,類(lei)似于 A tmp=*this. 假設b=c操作產生tmp1, 然后執(zhi)行(xing)a=tmp1,該過(guo)程還(huan)會(hui)產生臨時對(dui)象tmp2。還(huan)會(hui)有tmp1, tmp2的(de)析構(gou)。過(guo)程變得復雜許多。 第二(er):對于(a=b)=c, 操作不能以期望的方式進行。 假設(she)a=b產生臨時對象tmp1, 然后tmp1=c, 這樣a不能獲得(de)c的值,與(yu)常識不符。
相關資訊
發表評論
|