请用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; }