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
并将其赋值给自身。这样就不再共享字符串。代码的某些部分有点太“聪明”。如果我是你,我就不会浪费太多时间去理解它。这不是很有用。