題目
請用c++ 實現stl中的string類,實現構造,拷貝構造,析構,賦值,比較,字符串相加,獲取長度及子串等功能。
代碼
/*-------------------------------------
* 日期:2015-03-31
* 作者:SJF0115
* 題目: 實現string類
* 來源:百度
* 博客:
------------------------------------*/
#include
#include
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);
// 字符串賦值
String & operator=(const char* str);
// 判斷是否字符串相等
bool operator==(const String &str);
// 獲取字符串長度
int length();
// 求子字符串[start,start+n-1]
String substr(int start, int n);
// 重載輸出
friend ostream & operator<<(ostream &o,const String &str);
private:
char* data;
int size;
};
// 構造函數
String::String(const char *str){
if(str == NULL){
data = new char[1];
data[0] = '\0';
size = 0;
}//if
else{
size = strlen(str);
data = new char[size+1];
strcpy(data,str);
}//else
}
// 復制構造函數
String::String(const String &str){
size = str.size;
data = new char[size+1];
strcpy(data,str.data);
}
// 析構函數
String::~String(){
delete[] data;
}
// 字符串連接
String String::operator+(const String &str){
String newStr;
//釋放原有空間
delete[] newStr.data;
newStr.size = size + str.size;
newStr.data = new char[newStr.size+1];
strcpy(newStr.data,data);
strcpy(newStr.data+size,str.data);
return newStr;
}
// 字符串賦值
String & String::operator=(const String &str){
if(data == str.data){
return *this;
}//if
delete [] data;
size = str.size;
data = new char[size+1];
strcpy(data,str.data);
return *this;
}
// 字符串賦值
String& String::operator=(const char* str){
if(data == str){
return *this;
}//if
delete[] data;
size = strlen(str);
data = new char[size+1];
strcpy(data,str);
return *this;
}
// 判斷是否字符串相等
bool String::operator==(const String &str){
return strcmp(data,str.data) == 0;
}
// 獲取字符串長度
int String::length(){
return size;
}
// 求子字符串[start,start+n-1]
String String::substr(int start, int n){
String newStr;
// 釋放原有內存
delete [] newStr.data;
// 重新申請內存
newStr.data = new char[n+1];
for(int i = 0;i < n;++i){
newStr.data[i] = data[start+i];
}//for
newStr.data[n] = '\0';
newStr.size = n;
return newStr;
}
// 重載輸出
ostream & operator<<(ostream &o, const String &str){
o<"<