Effective_C++:17、在operator=中檢查是否“自己賦值給自己”

17、在operator=中檢查是否“自己賦值給自己”

1、爲何檢查是否“自己賦值給自己”

在使用賦值操作符時,我們只要求調用的對象類型、參數類型正確即可。所以,自己賦值給自己是完全合法的,如可能將一個對象的別名作爲另一個對象賦值給這個對象。發生自己賦值給自己,可能會發生一些問題,爲此,我們需要檢查是否“自己賦值給自己”。

1.爲了確保正確性。使用賦值操作符給左邊的對象配置新資源時,可能需要先釋放他原來配置的資源,此時若發生自己給自己賦值,則會失敗,因爲他同時也將要配置的新資源釋放掉了。如String對象的賦值操作符,就會先delete左邊對象的舊有內存,然後再用new配置新內存,若發生自己給自己賦值,則delete之後,同時也將賦值對象的內存delete,無法再使用new來配置新內存。

2.爲了效率。在進行賦值時,若是自己給自己賦值,那直接返回即可,而無需進行後續的一些不必要的動作。

2、如何檢查是否“自己賦值給自己”

檢查是否“自己賦值給自己”,就是檢查這兩個對象是否相同,即object identity。而對於兩個對象是否相同的定義通常爲以下兩種。

1.檢查他們是否有相同的值。

2.檢查他們的內存地址是否相同。

而對於要求更精確的時候,可能需要通過一個成員函數返回一個對象識別碼來檢查兩個對象是否相同。

實際上,在出現指針和引用的時候,任何兩個代表兼容型別的對象名稱,都有可能實際上指向同一個對象。因此,在寫函數寫代碼時,必須考慮這種情況的可能性。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章