了解副本的基础上写
关于这一行:了解副本的基础上写
通过void setChar(size_t index, char c)
去的s[9]
,但什么是*this
(里面,如果在该行:``)?
是否s1
或nullptr
?那么什么是_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;
一如既往*this
是函数执行的对象。如果您位于s1[4]
内,*this
将为s1
。
使用*this = _str;
只是一种调用MyString
的operator=
过载之一的涉及方式。它通过为自己分配_str
的新副本而具有“取消共享”的效果。
另外,已经有相当一段时间了解引用计数的字符串不是优化。例如,在s1[0]
的输出中,该代码将创建一个不必要的CharProxy
,以防有人为其分配值。即使您从不打算分享它,也可以为每个字符串的refcount分配一个单独的内存分配。
但s1是一个对象,而_str是成员,为什么赋值有效?它是否是同一个对象的赋值:因为_str也是“Hello”? – tami
它是一个(C风格)字符串,不管它是否是成员,所以它创建一个新的'MyString'并将其分配给它自己。这样字符串不再被共享。代码的某些部分有点太“聪明”了。如果我是你,我不会浪费太多时间来试图理解它。这不是很有用。 –
而且当您使用调试器来遍历代码时,一次一行地检查所有字符串的值变量和对象,你对你问的问题有什么看法?你知道如何使用调试器自己回答这些简单的问题,对吗?因为,众所周知,知道如何使用调试器是每个C++开发人员必备的技能。 –
那么“_str”怎么样? – tami
它在那里,因为它在那里。你的问题不清楚。 –