天天看点

运算符重载 : Cstring实现

class Cstring 
{
public:
	Cstring(char*ptr=NULL) 
	{
		if(cptr == NULL)
		{
			cptr = new char[1];
			cptr[0] = 0;
		}
		else
		{
			cptr = new char[strlen(ptr)+1];
			strcpy(cptr,ptr);
		}
	}
	~Cstring()
	{
		delete []cptr;
		cptr =NULL;
	}
	Cstring(const Cstring &src )
	{
		//拷贝构造函数
		cptr = new char[strlen(src.cptr)+1];
		strcpy(cptr,src.cptr);
	}
	//返回的不是局部变量就返回引用
	Cstring &operator=(const Cstring &src)
	{
		if( cptr == src.cptr)
		{
			return *this;
		}
		  delete []cptr; 

		  cptr = new char[strlen(src.cptr)+1];
		  strcpy(cptr,src.cptr);
		  return *this;
	}

	bool operator>(const Cstring &src)
	{
		return strcmp(cptr,src.cptr)>0;
	}
	bool operator<(const Cstring &src)
	{
		return strcmp(cptr,src.cptr)<0;
	}
	bool operator==(const Cstring &src)
	{
		return strcmp(cptr,src.cptr)==0;
	}
	char&operator[](int i)
	{
		return cptr[i];
	}
	char* c_str()
	{
		return cptr;
	}
	int length()
	{
		return strlen(cptr);
	}
private:
	char*cptr ;
	friend ostream& operator<<(ostream &out , const Cstring &src) ;
	friend Cstring operator+(const Cstring &src, const  Cstring &srv);
};

ostream& operator<<(ostream &out , const Cstring &src)
{
	cout<<src.cptr;
	return out;
}

Cstring operator+(const Cstring &src, const  Cstring &srv)
{
	char *p = new char[strlen(src.cptr)+strlen(srv.cptr)];
	strcpy(p,src.cptr);
	strcat(p,srv.cptr);
	Cstring tmp(p);
	return tmp;
}

int main()
{
	Cstring str1 = "abc";
	Cstring str2="bcd";
	Cstring str4 = str2;
	Cstring str3=str1+str2;
	cout<<str4<<endl;
	cout<<str3<<endl;
	system("pause");
	return 0;
}