/*
系统提供的,是深拷贝,不提供写时拷贝,因为系统不知道你使用【】是写还是读,读的话用写时拷贝反倒是浪费空间。
*/
#include
#include<string.h>
#include<vld.h>
class String
{
public:
String()
{
mptr = NULL;
}
String(const char * ptr)
{
mptr = new char(strlen(ptr)+1+4);
mptr += 4;
strcpy_s(mptr,strlen(ptr)+1,ptr);
getRef() = 1;
}
String(const String& rhs)//浅拷贝
{
mptr = rhs.mptr;
getRef()++;
}
String& operator = (const String& rhs)//浅拷贝
{
if(this != &rhs)//不是自身赋值
{
getRef()--;
if(getRef() == 0)
{
delete (mptr - 4);
}
mptr = rhs.mptr;
getRef()++;
}
return *this;
}
char & operator [] (int index)//深拷贝
{
if(getRef() > 1)//该内存至少有两个对象指向
{
char *ptmp = new char(strlen(mptr)+1+4);
ptmp += 4;
strcpy_s(ptmp,strlen(mptr)+1,mptr);
--getRef();
mptr = ptmp;
getRef() = 1;
}
return mptr[index];
}
~String()//特殊处理
{
--getRef();
if(getRef() == 0)
{
delete (mptr - 4);
}
mptr = NULL;
}
private:
int& getRef()
{
return *(int *)(mptr - 4);
}
char * mptr;
};
int main()
{
String str1 = “hello”;
String str2 = str1;
String str3 = str2;
String str4 = "world";
str2 = str4;
str1[0] = 'l';
return 0;
}
本文深入探讨了深拷贝与写时拷贝的概念及其在C++字符串类实现中的应用。通过具体代码示例,展示了如何在C++中实现一个自定义的字符串类,包括构造函数、赋值操作符、下标运算符和析构函数,以支持深拷贝和写时拷贝策略,避免不必要的内存浪费。
618

被折叠的 条评论
为什么被折叠?



