C++賦值運算符
C++當中允許類對象賦值,這是通過默認的重載賦值運算符實現的,它的原型如下:
Class_name & Class_name::operator=(const Class_name &);
它接受並返回一個指向類對象的引用。
將已有的對象賦給另一個對象時,將會使用重載的賦值運算符:
StringBad headline1("Celery"); StringBad knot; knot = headline1; // 調用賦值運算符
如果是對象初始化的過程,則不一定會使用賦值運算符,比如:
StringBad metoo = knot;
像是這種情況很難說,因為metoo
是一個新建的對象,它可以使用拷貝構造函數。然而,也可以分成兩步來處理,先使用拷貝構造函數創建一個臨時對象,然後在賦值的時候使用賦值運算符復制到新對象中去也是可以的。
和拷貝構造函數類似,默認賦值運算符的實現也是對成員進行逐個復制。如果成員本身就是累對象,那麼會使用這個類的賦值運算符來復制。
賦值運算符的問題在哪裡呢?我們還是看下之前StringBad
那個例子,
我們看下下面這段代碼:
StringBad sb("test"); StringBad sports("Spinach Leaves Bowl for Dollars"); StringBad knot; knot = sports;
當我們運行的時候就會遇到這樣的報錯:
報錯的原因日志裡寫得很清楚,我們嘗試釋放一個沒有被分配的內存。
會報錯的原因很簡單,因為我們執行knot = sports
的時候,兩個對象內部的字符串指向的是同一個地址。這就導致瞭析構knot
的時候sports
對象對應的內容已經不存在瞭。
解決方案也很簡單,就是我們自己重載賦值運算符,保證不會出現簡單拷貝的問題。
StringBad & StringBad::operator= (const StringBad & st) { if (this == &st) return *this; delete []str; len = st.len; str = new char[len+1]; std::strcpy(str, st.str); return *this; }
到此這篇關於C++賦值運算符的文章就介紹到這瞭,更多相關C++賦值運算符內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!