1. 程式人生 > >C++沉思錄__String類的設計

C++沉思錄__String類的設計

class String {
public:
	String(char* p){
		assign(p, strlen(p));
	}
	String(const String& s){
		assign(s.data, s.sz);
	}
	 ~String(){delete[] data;}
      void make_cstring(char* p, int len) const
    {
	  if(sz <= len)
		strcpy(p, data);        
	  else
		throw("Not enough memory supplied");
    }

	String& operator=(const String& s){        //不能先刪除資料然後呼叫assign,因為把一個String賦給它自身肯定會失敗
		if(this != &s){
			delete[] data;
			assign(s.data, s.sz);
		}
		return *this;
	}
  String& String::operator+=(const String& s)
    {
	char* odata = data;
	assign(odata, sz+s.sz+1);
	strcat(data, s.data);
	delete [] odata;
	return *this;
    }


private:
	int sz;
	char* data;
	void assign(const char* s, unsigned len)
	{
        int n =len +1;
		data = (char*)malloc(n*sizeof(char));
		if(data == 0)
			throw std::bad_alloc();
		sz = len;
		strcpy(data, s);
	}
};
  String operator+(const String& op1, const String& op2)
    {
	String ret(op1);
	ret += op2;
	return ret;
    }