String類は簡単に実現されます(構造、コピー構造、分析、分配、出力、比較、文字列プラス、長さ、サブストリング)

3126 ワード

説明を実現する:文字列クラスStringの簡単な実現、内部は文字配列を採用して実現します.
運行プラットフォーム:VSL 2010
参考:http://rsljdkt.iteye.com/blog/770072
経験説明:コピーコンストラクタ、リロード演算子、コンストラクタを実現する3つの操作は、カスタムクラスを実現する際に、しばしば同時に出現します.
 
#include <iostream>
using namespace std;

class String{
public:
	String(const char *str = NULL);//      
	String(const String &str);//      
	~String();//    
	String operator+(const String & str);//     
	String & operator=(const String &str);//     
	bool operator==(const String &str);//         
	int Length();//       
	friend ostream & operator<<(ostream &o,const String &str);//    
	String SubStr(int start, int end);//     (start ... end-1)
private:
	char * charArray;
};

String::String(const char *str)
{
	if(str == NULL){
		charArray=new char[1];
		charArray[0]='\0';
	}else{
		charArray=new char[strlen(str)+1];
		strcpy(charArray,str);
	}
}
String::String(const String &str)
{
	charArray = new char[strlen(str.charArray)+1];
	strcpy(charArray,str.charArray);
}
String::~String()
{
	delete [] charArray;
}
String String::operator+(const String &str)
{
	String res;
	delete [] res.charArray;//      
	res.charArray = new char[strlen(charArray)+strlen(str.charArray)+1];
	strcpy(res.charArray,charArray);
	strcpy(res.charArray+strlen(charArray),str.charArray);
	return res;
}
String & String::operator=(const String &str)
{
	if(charArray == str.charArray)
		return *this;
	delete [] charArray;
	charArray = new char[strlen(str.charArray)+1];
	strcpy(charArray,str.charArray);
	return *this;
}
bool String::operator==(const String &str)
{
	return strcmp(charArray,str.charArray) == 0;
}
int String::Length()
{
	return strlen(charArray);
}
ostream & operator<<(ostream &o, const String &str)
{
	o<<str.charArray;
	return o;
}

String String::SubStr(int start, int end)
{
	String res;
	delete [] res.charArray;//      
	res.charArray = new char[end-start+1];//      
	for(int i=0; i+start<end; i++){
		res.charArray[i]=charArray[start+i];
	}
	res.charArray[end-start] = '\0';
	return res;
}

void test()
{
	String s = "abcd";
	String t = "abcd";
	cout<<s<<(s==t?" == ":" != ")<<t<<endl;

	String s2 = "Hello ";
	String s3 = "China!";
	cout<<s2+s3<<endl;
	cout<<(s2+s3).SubStr(0,s2.Length()+s3.Length())<<endl;
}

int main()
{
        test();
        system("pause");
}
 
 
実行結果:
abcd == abcd
Hello China!
Hello China!
       . . .