class String
{
public:
String(constchar*str)
:_str(newchar [strlen(str)+1])
{
strcpy(_str,str);
}
String(constString&str)
:_str(str._str)
{}
String& operator=(constString& str)
{
if(this!= &str)
{
_str=str._str;
}
return *this;
}
~String()
{
if(_str)
{
delete[]_str;
}
}
private:
char*_str;
};
voidTestString()
{
Strings1("hello world!");
Strings2=s1;
}
当类里面有指针对象时,进行简单赋值的浅拷贝,两个对象指向同一块内存,存在崩溃的问题!
这里我们要进行深拷贝。
- 深拷贝及String类的深浅拷贝实现(简单模拟string)
- 简单模拟String实现
#include <iostream>
#include <string.h>
using namespace std;
class String{
public:
String(const char* str = "")
:_str(new char[strlen(str)+1])
{
strcpy(_str,str);
}
String(const String& s)
:_str(new char[strlen(s._str) + 1])
{
strcpy(_str,s._str);
}
String& operator=(const String& s)
{
if (&s != this)
{
char *str = new char[strlen(s._str) + 1];
strcpy(str, s._str);
delete[] _str;
_str = str;
}
return *this;
}
const char* c_str()
{
return _str;
}
char& operator[](size_t pos)
{
return _str[pos];
}
~String()
{
if (_str != nullptr)
{
delete[] _str;
}
}
private:
char* _str;
};
namespace COW
{
class String{
public:
String(const char* str = "")
:_str(new char[strlen(str) + 1])
, _pCount(new int(1))
{
strcpy(_str, str);
}
String(const String& s)
:_str(s._str)
, _pCount(s._pCount)
{
(*_pCount)++;
}
void CopyOnWrite()
{
if (*_pCount > 1)
{
char* newStr = new char[strlen(_str) + 1];
strcpy(newStr, _str);
_str = newStr;
--(*_pCount);
_pCount = new int(1);
}
}
void Release()
{
if (--(*_pCount) == 0)
{
delete[] _str;
delete _pCount;
_str = NULL;
_pCount = NULL;
}
}
const char& operator[](size_t pos) const
{
return _str[pos];
}
char& operator[](size_t pos)
{
CopyOnWrite();
return _str[pos];
}
~String()
{
Release();
}
private:
char* _str;
int* _pCount;
};
}
int main(void)
{
String s1("change world");
String s2(s1);
cout<<s2.PushBack('!');
cout<<s2.PushBack("I am Coming");
cout<<s1 += "I am Coming";
cout<<s1 += '!';
return 0;
}