C++ 了解“写下即复制”的基础知识

C++ 了解“写下即复制”的基础知识,c++,proxy,copy,C++,Proxy,Copy,关于这一行: 通过void setChar(size\u t index,char c)的s[9],但是*这个是什么(在if内,在第``行中) 是s1还是nullptr?那么什么是\u str(在同一行:*this=\u str;),是s1 class MyString { size_t _size = 0; char* _str = nullptr; int* _pRefCount = nullptr; } operator char

关于这一行:

通过
void setChar(size\u t index,char c)
s[9]
,但是
*这个
是什么(在if内,在第``行中)

s1
还是
nullptr
?那么什么是
\u str
(在同一行:
*this=\u 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;

与往常一样,
*此
是执行函数的对象。如果您在
s1[4]
内,则
*这将是
s1

使用
*this=\u str
只是调用
MyString
操作符=
重载之一的一种复杂方式。通过将
\u str
的新副本分配给自身,它具有“取消共享”的效果


另外,很长一段时间以来,人们都知道引用计数字符串不是一种优化。例如,在
s1[0]
的输出中,代码将创建一个不必要的
CharProxy
,以防有人给它赋值。您还可以为创建的每个字符串的refcount获得单独的内存分配,即使您从未打算共享它

。当您使用调试器一次一行地逐步检查代码,检查所有变量和对象的值时,您对您提出的问题做了哪些观察?您知道如何使用调试器自己回答这些简单的问题,对吗?因为,众所周知,知道如何使用调试器是每个C++开发者所需的技能。那么,它是如何存在的?因为它在那里。你的问题不清楚。但s1是一个对象,而_str是一个成员,为什么赋值有效?它是同一个对象对自身的赋值吗:因为_str也是“Hello”?它是一个(C样式)字符串,无论它是否是成员,因此它创建一个新的
MyString
并将其赋值给自身。这样就不再共享字符串。代码的某些部分有点太“聪明”。如果我是你,我就不会浪费太多时间去理解它。这不是很有用。