課程里痪署,在實(shí)現(xiàn)string類的copy op=時(shí),提到一個(gè)很重要的處理兄旬,檢測(cè)自我賦值(self assignment)狼犯。
自我賦值檢查,一來(lái)提高效率领铐,二來(lái)避免自我賦值時(shí)出現(xiàn)內(nèi)存錯(cuò)誤悯森,具體情況課程時(shí)老師都有講到,不做贅述罐孝。這里想討論的呐馆,是檢測(cè)自我賦值的方法。
? ? ? ?課程學(xué)習(xí)中莲兢,看到上圖紅框中的檢測(cè)方式汹来,當(dāng)時(shí)有一個(gè)疑問,為什么可以直接比較這兩個(gè)對(duì)象呢改艇?難道不需要進(jìn)行“==”的重載嗎收班?聽完課程,到作業(yè)部分時(shí)候谒兄,同樣需要實(shí)現(xiàn)一個(gè)copy
op=摔桦。依葫蘆畫瓢,做了自我賦值的檢測(cè),驗(yàn)證代碼寫好邻耕,程序運(yùn)行鸥咖,沒有報(bào)錯(cuò),結(jié)果正確兄世,果然不需要重載就可以了啼辣!
? ? ? ?到了這一步,疑惑更大了御滩,為什么會(huì)這樣鸥拧?想不出所以然,直接跟代碼削解。
果然一致富弦!有點(diǎn)懵比了,第一周課程里的operator==氛驮,難道是沒有必要的嗎腕柜?沒道理啊柳爽?媳握!
再仔細(xì)比對(duì)碱屁,終于發(fā)現(xiàn)問題了磷脯。這里的==,比較的不是兩個(gè)對(duì)象娩脾,是兩個(gè)指針赵誓,也就是兩個(gè)地址!兩個(gè)對(duì)象的地址一致柿赊,當(dāng)然可以說兩個(gè)對(duì)象其實(shí)是同一個(gè)了俩功。
再進(jìn)一步思考,如果這里真的使用重載后的==碰声,進(jìn)行兩個(gè)對(duì)象的比較诡蜓,即使兩個(gè)對(duì)象相等,如果地址不同胰挑,也不能說是同一個(gè)對(duì)象蔓罚,所以,這種判斷方式反而是無(wú)效的瞻颂。
那么豺谈,還有沒有什么方法可以進(jìn)行判斷呢?如果對(duì)每個(gè)對(duì)象都能有個(gè)唯一的ID進(jìn)行標(biāo)記贡这,然后對(duì)比對(duì)象的這個(gè)唯一ID茬末?好像沒問題。廢話不多說盖矫,代碼簡(jiǎn)單的改造一下丽惭,也不去創(chuàng)建GUID了击奶,直接利用Sharp基類中的_no,外部傳入不同的值作為唯一ID使用责掏,改造后代碼如下:
再看運(yùn)行結(jié)果:
事實(shí)證明正歼,這種方式也是可行的,當(dāng)然拷橘,相比之前的地址比較的方式局义,有點(diǎn)畫蛇添足。
但如果是在不支持內(nèi)存地址訪問的語(yǔ)言中冗疮,比如c#/Java之類的萄唇,應(yīng)該就能派上用場(chǎng)了。
本人其它學(xué)習(xí)筆記: