2015-12-28 197 views
-1

我正在查看字符串類的賦值運算符的一些代碼,並且有一些概念我不明白。字符串賦值運算符C++

1)的參數是一個常數,而是價值最終得到改變,我認爲常量不能得到改變?

2)您傳遞字符串參數的地址,然後在if語句您再次訪問地址,不能你離開了&符號,因爲只是用「權」的地址應該已經被訪問?

String& String::operator=(const String& right) //why is const passed is a new value gets assigned? 
    { 
    if (this != &right) // Cant this be if(this != right) 
     { 
      delete[] buffer; // Get rid of old buffer len = right.length(); 
      buffer = new char[len + 1]; 
      for (int i = 0; i < len; i++) 
      buffer[i] = right[i]; 
      buffer[len] = '\0'; 
     } 
    return *this; 
    } 

回答

1

請將單獨的問題在未來發布。

在(1),你混淆了分配的兩個方面。 右側側是const。 a=b絕對不會改變b

(2)您傳遞一個表達式,而不是地址。 right是對該表達的參考。另一方面是this是一個指針。檢查你的書,這是基本的C++。

0

該字符串傳遞在作爲一個const 參考,而不是作爲一個const指針。因此,檢查必須是this != &right才能獲得指針與指針的比較。

+0

不是指針只是一個內存地址?所以不會這!!=只是比較兩個內存地址? – user2076774

+0

'this'是一個指向調用'operator ='的字符串的指針。 'right'是String的一個* const引用。因此'this!= right'會嘗試比較一個指向String的指針與const String。你必須用'&'來獲取地址 – Alec

+0

是不是在參數中傳遞的地址?不只是一個字符串,但地址? – user2076774

0

1)您正在傳入const引用,這意味着您無法更改right參數,但可以更改this的內容。

2)this是一個指針。 right是一個參考。他們不一樣,所以你不能直接比較。您可以使用&right獲取參考地址。

0

當調用上兩個字符串,A和B,例如,A = B的賦值運算符,該字符串B被傳遞作爲const引用。字符串A是被修改的內容。

在這一行這個!= &對,我們正在比較這個(指向LHS上=字符串的指針)到&右邊(等號右邊的字符串地址)。將指針與字符串進行比較沒有任何意義,如果我們使用這個!= right,就​​會發生。

+0

如果參數是(const String&right)並不意味着「right」作爲地址傳遞?所以當你寫這個!= right的時候,你會不會比較指針「this」指向的地址和地址「right」指向的地址?我覺得在if語句中說'對'是多餘的,因爲地址已經作爲一個爭論通過了嗎? – user2076774

+0

我認爲你混淆了引用和指針之間的重要區別。當參數被列爲(const String&right)時,它意味着右邊被作爲參考傳遞 - 而不是指針。因此,函數中出現的任何位置都會被視爲字符串對象(儘管它是對傳入的字符串的引用)。因此,在程序中,爲了獲得正確的內存地址,我們必須寫入&right(這會得到一個引用的地址,它與被引用的原始字符串的地址相同)。 – AH10