第九章 過載賦值運算子中需要注意的兩個問題

2021-09-07 08:53:50 字數 763 閱讀 5878

如果系統自動生成的賦值運算子過載函式不合乎你的要求,那麼就應當定製自己的賦值運算子。

然而,定製賦值運算子有兩點是非常值得注意的,本文將講解這兩點,讓你寫出更優質的 =運算子。

我們經常使用如 "a=b=c=1" 這種形式的連鎖賦值語句,而過載的賦值運算子自然也應當能夠這樣使用。

因此,在過載運算子函式末尾請寫上如這樣的語句 return *this;

除了賦值運算子,+=,-=這樣的賦值運算子同樣需要這樣做。

首先,我們看一段問題**:

1

//位圖資源類

2class bitmap ;34

//位圖資源管理類

5class

widget ;

1516 widget & widget::operator=(const widget &rhs)

17

問題出在過載函式中,如果左右運算元是相同的物件,delete 掉原有資源之後,所有資料資訊就全丟了。

1 widget & widget::operator=(const widget &rhs)

2

但這依然不是最好的做法:因為 new 有可能失敗,導致資源丟失。

1 widget & widget::operator=(const widget &rhs)

2

這個實現就保證了賦值的安全,健壯,是個非常可取的方案。

賦值運算子還有一些其他的非常可取的實現,這裡就不一一講解了。

第九章 過載賦值運算子中需要注意的兩個問題

如果系統自動生成的賦值運算子過載函式不合乎你的要求,那麼就應當定製自己的賦值運算子。然而,定製賦值運算子有兩點是非常值得注意的,本文將講解這兩點,讓你寫出更優質的 運算子。我們經常使用如 a b c 1 這種形式的連鎖賦值語句,而過載的賦值運算子自然也應當能夠這樣使用。因此,在過載運算子函式末尾請寫...

第九章 運算子

ruby 的運算子大多都是作為例項方法提供給我們使用的,因此我們可以很方便地定義或者重定義運算子,改變其原有的含義。但是,表 9.3 中列舉的運算 符是不允許修改的。二元運算子 definspect 用於顯示 end 左側是方法呼叫者定義時可以不寫,右側other就是方法的引數 def other ...

過載及運算子過載需要注意的地方

運算子過載 operator overload 是c 的乙個重要的新特性,它使得程式設計師把c 運算子定義擴充套件到運算元是物件的情況.運算子過載的目的是使c 程式更加直觀,更易懂.但這種方便有時候也帶來一些潛在的危險 運算子過載和普通的過載一樣 作用域相同,函式名字相同,但引數不同 引數個數,引數...