国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

Hi,歡迎來到嵌入式培訓(xùn)高端品牌 - 華清遠見教育科技集團<北京總部官網(wǎng)>,專注嵌入式工程師培養(yǎng)15年!
當(dāng)前位置: > 華清遠見教育科技集團 > 嵌入式學(xué)習(xí) > 講師博文 > 賦值函數(shù)剖析
賦值函數(shù)剖析
時間:2017-01-04作者:華清遠見

構(gòu)造函數(shù),拷貝構(gòu)造函數(shù),賦值函數(shù)和析構(gòu)函數(shù)是C++類中基本的四大函數(shù)。當(dāng)設(shè)計一個類時,要首先考慮這四大函數(shù)的寫法。若沒有提供顯式的實現(xiàn),編譯器會產(chǎn)生默認(rèn)的函數(shù)。若類中有指針成員,必須提供這四大函數(shù)的實現(xiàn),否則容易出現(xiàn)內(nèi)存錯誤。本文針對賦值函數(shù)進行了分析,包括其原型,調(diào)用場合,存在的必要性等方面。

1. 賦值函數(shù)原型

A& operator =( const A& other) { … … }

2. 調(diào)用場合

A a1(10);        // 為a1調(diào)用構(gòu)造函數(shù)
        A a2;         // 為a2調(diào)用默認(rèn)構(gòu)造函數(shù)
        a2 = a1;        // 為a2調(diào)用賦值函數(shù)。
        A & operator =(const A &a){
                if (&a == this)
                        return *this; 
                //... 具體賦值操作
                return *this;}

3.考察:

1) 為何首先檢查同一性?

答:為了防止自賦值

2) (a=b)=c或者a=(b=c)是否合法

答:合法

3) 若定義為void operator =(const A &a) 有何局限?

答:沒有了返回值,就不能實現(xiàn)a=b=c 這樣的鏈?zhǔn)綇?fù)值。用法不夠靈活。

4) 賦值函數(shù)存在的必要性

答:以類String的兩個對象a,b為例,假設(shè)a.m_data的內(nèi)容為“hello”,b.m_data的內(nèi)容為“world”,F(xiàn)將a賦給b,缺省賦值函數(shù)的“位拷貝”意味著執(zhí)行b.m_data = a.m_data。這將造成三個錯誤:一是b.m_data原有的內(nèi)存沒被釋放,造成內(nèi)存泄露;二是b.m_data和a.m_data指向同一塊內(nèi)存,a或b任何一方變動都會影響另一方;三是在對象被析構(gòu)時,m_data被釋放了兩次。

5) 若定義為A operator =(const A &a){...return *this;},有何局限?

答:若返回值改成了不是引用類型,則有兩個局限。

第一:對于a=(b=c), 操作仍然可以正常進行,但效率降低了。

因為此時的賦值函數(shù)會產(chǎn)生一個臨時對象,類似于 A tmp=*this. 假設(shè)b=c操作產(chǎn)生tmp1, 然后執(zhí)行a=tmp1,該過程還會產(chǎn)生臨時對象tmp2。還會有tmp1, tmp2的析構(gòu)。過程變得復(fù)雜許多。

第二:對于(a=b)=c, 操作不能以期望的方式進行。

假設(shè)a=b產(chǎn)生臨時對象tmp1, 然后tmp1=c, 這樣a不能獲得c的值,與常識不符。

發(fā)表評論
評論列表(網(wǎng)友評論僅供網(wǎng)友表達個人看法,并不表明本站同意其觀點或證實其描述)