string類的實現終極版
阿新 • • 發佈:2019-02-08
寫時拷貝(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; }