stringクラスの実装究極版
書き込み時コピー(COW)の実現:
#include<iostream>
#include<cassert>
using namespace std;
class String
{
public:
String(char *str="")
:_str(new char[strlen(str)+sizeof(int)+1])
{
*(int*)_str=1;
_str+=4;
strcpy(_str,str);
}
String(const String& str)
:_str(str._str)
{
++(*(int*)(_str-4));
}
~String()
{
if(_str!=NULL)
{
if(--(*(int*)(_str-4)))
{
delete[] (_str-4);
}
}
}
String& operator=(const String& str)
{
if(this!=&str)
{
if(--(*(int*)(_str-4)))
{
delete[] (_str-4);
}
_str=str._str;
++(*(int*)(_str-4));
}
return *this;
}
char& operator[](int index)
{
assert(index>=0 && index<strlen(_str));
_str[index]=*(_str+index);
return _str[index];
}
friend ostream& operator<<(ostream& os,const String& str);
private:
char *_str;
};
ostream& operator<<(ostream& os,const String& str)
{
cout<<str._str<<endl;
return os;
}
int main()
{
//String s1("hello");
String s2("abcdefg");
cout<<s2;
cout<<s2[0];
getchar();
//String s3=s2;
//String s3(s2);
return 0;
}