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!

推薦閱讀: