了解副本的基础上写

问题描述:

关于这一行:了解副本的基础上写

通过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

它在那里,因为它在那里。你的问题不清楚。 –

一如既往*this是函数执行的对象。如果您位于s1[4]内,*this将为s1

使用*this = _str;只是一种调用MyStringoperator=过载之一的涉及方式。它通过为自己分配_str的新副本而具有“取消共享”的效果。

另外,已经有相当一段时间了解引用计数的字符串不是优化。例如,在s1[0]的输出中,该代码将创建一个不必要的CharProxy,以防有人为其分配值。即使您从不打算分享它,也可以为每个字符串的refcount分配一个单独的内存分配。

+0

但s1是一个对象,而_str是成员,为什么赋值有效?它是否是同一个对象的赋值:因为_str也是“Hello”? – tami

+1

它是一个(C风格)字符串,不管它是否是成员,所以它创建一个新的'MyString'并将其分配给它自己。这样字符串不再被共享。代码的某些部分有点太“聪明”了。如果我是你,我不会浪费太多时间来试图理解它。这不是很有用。 –