2017-09-24 43 views
-1

關於這一行:瞭解副本的基礎上寫

通過void setChar(size_t index, char c)去的s[9],但什麼是*this(裏面,如果在該行:``)?

是否s1nullptr?那麼什麼是_str(在同一行:*this = _str;),它是s1

class MyString { 
    size_t _size = 0; 
    char* _str = nullptr; 
    int* _pRefCount = nullptr; 


     } 
     operator char() const { 
      return ((const MyString&)_s)[_index]; 
     } 
    }; 

    void detach() { 

     if(_pRefCount && --*_pRefCount == 0) { 
      delete []_str; 
      delete _pRefCount; 
     } 
    } 

    void attach(const MyString& str) { 
     _size = str._size; 
     _str = str._str; 
     _pRefCount = str._pRefCount; 
     ++*_pRefCount; 
+1

而且當您使用調試器來遍歷代碼時,一次一行地檢查所有字符串的值變量和對象,你對你問的問題有什麼看法?你知道如何使用調試器自己回答這些簡單的問題,對嗎?因爲,衆所周知,知道如何使用調試器是每個C++開發人員必備的技能。 –

+0

那麼「_str」怎麼樣? – tami

+0

它在那裏,因爲它在那裏。你的問題不清楚。 –

回答

0

一如既往*this是函數執行的對象。如果您位於s1[4]內,*this將爲s1

使用*this = _str;只是一種調用MyStringoperator=過載之一的涉及方式。它通過爲自己分配_str的新副本而具有「取消共享」的效果。

另外,已經有相當一段時間瞭解引用計數的字符串不是優化。例如,在s1[0]的輸出中,該代碼將創建一個不必要的CharProxy,以防有人爲其分配值。即使您從不打算分享它,也可以爲每個字符串的refcount分配一個單獨的內存分配。

+0

但s1是一個對象,而_str是成員,爲什麼賦值有效?它是否是同一個對象的賦值:因爲_str也是「Hello」? – tami

+1

它是一個(C風格)字符串,不管它是否是成員,所以它創建一個新的'MyString'並將其分配給它自己。這樣字符串不再被共享。代碼的某些部分有點太「聰明」了。如果我是你,我不會浪費太多時間來試圖理解它。這不是很有用。 –