请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
#include <utility>
#include <string.h>
classString
{
public:
String():data_(newchar[1])
{
*data_ = '\0';
}
String(const char * str):data_(newchar[strlen(str) + 1])
{
strcpy(data_, str);
}
String(const String & rhs)
: data_(newchar[rhs.size() + 1])
{
strcpy(data_, rhs.c_str());
}
/* Delegate constructor in C++11
String(const String& rhs):String(rhs.data_)
{
}
*/
~String()
{
delete[] data_;
}
/* Traditional:
String& operator=(const String& rhs)
{
String tmp(rhs);
swap(tmp);
return *this;
}
*/
String &operator=(String rhs)// yes, pass-by-value
{
swap(rhs);
return*this;
}
// C++ 11
String(String &&rhs): data_(rhs.data_)
{
rhs.data_ = nullptr;
}
String &operator=(String && rhs)
{
swap(rhs);
return*this;
}
// Accessors
size_t size() const
{
return strlen(data_);
}
const char * c_str() const
{
return data_;
}
void swap(String & rhs)
{
std::swap(data_, rhs.data_);
}
private:
char *data_;
};
String::String(const char* s)
{ if (nullptr == s) { m_data = new char[1]; m_data[0] = '\0'; } else { m_data = new char[strlen(s) + 1]; strcpy(m_data, s); //m_data[strlen(s)] = '\0'; //不需要,因为s+strlen(s)一定是'\0' } cout << "constructor: " << m_data << endl;
}
String::String(const String& rhs)
{ m_data = new char[strlen(rhs.m_data) + 1]; strcpy(m_data, rhs.m_data); cout << "copy constructor: " << m_data << endl;
}
//不需要检验rhs是否为nullptr,因为它存在就代表它已经在构造的时候获得至少一字节的内存
String& String::operator=(const String& rhs)
{ char* new_data = new char[strlen(rhs.m_data) + 1]; strcpy(new_data, rhs.m_data); delete[] m_data; //m_data一定非空 m_data = new_data; cout << "copy assignment: " << m_data << endl; return *this;
}
String::~String()
{ cout << "destructor: " <</* m_data <<*/ endl; delete[] m_data;
}
String::String(String&& rhs) : m_data(rhs.m_data)
{ rhs.m_data = nullptr; //为空不会调用析构函数 cout << "move constructor: " << m_data << endl;
}
String& String::operator=(String&& rhs)
{ if (this != &rhs) { delete[] m_data; m_data = rhs.m_data; rhs.m_data = nullptr; //rhs.m_data=nullptr后,rhs变为0X0? } cout << "move assginment: " << m_data << endl; return *this;
}
String& String::operator+=(const String& rhs)
{ char *new_data = new char[size() + rhs.size()]; strcpy(new_data, m_data); strcpy(new_data + size(), rhs.m_data); delete[] m_data; m_data = new_data; return *this;
}
String String::operator+(const String& rhs)
{ String ret_str; delete[] ret_str.m_data; char *new_data = new char[size() + rhs.size()]; strcpy(new_data, m_data); strcpy(new_data + size(), rhs.m_data); ret_str.m_data = new_data; return ret_str;
}
String String::substr(size_t pos, size_t count)
{ if (pos > size() - 1) { throw std::out_of_range("pos超出字符串范围"); } char* new_data; String ret_str; delete[] ret_str.m_data; if (pos + count >= size()) { new_data = new char[size() - pos]; strcpy(new_data, m_data + pos); } else { new_data = new char[count]; strncpy(new_data, m_data + pos, count); } ret_str.m_data = new_data; return ret_str;
}
#include <iostream> #include <cstring> 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<<str.data; return o; } int main(){ String str1("hello "); String str2 = "world"; String str3 = str1 + str2; cout<<"str1->"<<str1<<" size->"<<str1.length()<<endl; cout<<"str2->"<<str2<<" size->"<<str2.length()<<endl; cout<<"str3->"<<str3<<" size->"<<str3.length()<<endl; String str4("helloworld"); if(str3 == str4){ cout<<str3<<" 和 "<<str4<<" 是一样的"<<endl; }//if else{ cout<<str3<<" 和 "<<str4<<" 是不一样的"<<endl; } cout<<str3.substr(6,5)<<" size->"<<str3.substr(6,5).length()<<endl; return 0; }
/*------------------------------------- * 日期:2015-03-31 * 作者:SJF0115 * 题目: 实现string类 * 来源:百度 * 博客: ------------------------------------*/ #include <iostream> #include <cstring> 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<<str.data; return o; } int main(){ String str1("hello "); String str2 = "world"; String str3 = str1 + str2; cout<<"str1->"<<str1<<" size->"<<str1.length()<<endl; cout<<"str2->"<<str2<<" size->"<<str2.length()<<endl; cout<<"str3->"<<str3<<" size->"<<str3.length()<<endl; String str4("helloworld"); if(str3 == str4){ cout<<str3<<" 和 "<<str4<<" 是一样的"<<endl; }//if else{ cout<<str3<<" 和 "<<str4<<" 是不一样的"<<endl; } cout<<str3.substr(6,5)<<" size->"<<str3.substr(6,5).length()<<endl; return 0; }