1. 程式人生 > >C++實現String類

C++實現String類


class String{
public:
	String(const char* str = "")
	{
		if (NULL == str){
			_str = new char[1 + 4];
			_str += 4;
			*_str = '\0';
		}
		else{
			_str = new char[strlen(str) + 1 + 4];
			_str += 4;
			strcpy(_str, str);
		}
		GetRef() = 1;
	}

	String(const String& s)
		: _str(s._str)
	{
		GetRef()++;
	}

	String& operator=(const String& s)
	{
		if (_str != s._str){
			Release();
			_str = s._str;
			++GetRef();
		}
		return *this;
	}

	~String()
	{
		Release();
	}

	char& operator[](size_t index)
	{
		if (GetRef() > 1){
			char* temp = new char[strlen(_str) + 1 + 4];
			*(int*)temp = 1;
			temp += 4;
			strcpy(temp, _str);
			--GetRef();
			_str = temp;
		}
		return _str[index];
	}

	const char& operator[](size_t index)const
	{
		return _str[index];
	}

	void Release()
	{
		if (_str && 0 == --GetRef()){
			_str -= 4;
			delete[] _str;
			_str = NULL;
		}
	}

	int& GetRef(){
		return *((int*)_str - 1);
	}

private:
	char* _str;

};

void FunTest(){
	String s("abcd");
	String a(s);
	s[0] = 'q';
}

int main(){
	FunTest();
	return 0;
}