仿照string类,自己手动实现 My_string
代码如下
MyString.h
#ifndef MYSTRING_H
#define MYSTRING_H
#include <iostream>
#include <cstring>using namespace std;class My_string
{
private:char *ptr; int size; int len; public:My_string();My_string(const char* src);My_string(int num, char value);My_string(const My_string &other);My_string & operator= (const My_string &other);~My_string();bool Isvoid();void show();void push_back(char value);void pop_back();char &at(int index);void clear();char *data();int get_length();int get_size();bool Add();};
#endif
MyString.cpp
#include "MyString.h"My_string::My_string():size(15)
{this->ptr = new char[size];this->ptr[0] = '\0'; this->len = 0;cout<<"无参构造"<<endl;
}
My_string::My_string(const char* src):size(15) {this->ptr = new char[size];strcpy(ptr, src); this->len = strlen(src);cout << "一个形参的有参构造" << endl;
}
My_string::My_string(int num, char value):size(15),len(num){if(num>15){cout<<"超出默认长度"<<endl;return;}this->ptr = new char[15];for(int i=0;i<num;i++){this->ptr[i] = value;}cout<<"部分形参的有参构造"<<endl;
}
My_string::My_string(const My_string &other):size(other.size),len(other.len){this->ptr = new char[size];strcpy(this->ptr, other.ptr); cout<<"拷贝构造"<<endl;
}
My_string& My_string::operator= (const My_string &other){if(this != &other){delete[] ptr;this->len =other.len;this->size = other.size;for(int i=0;i<other.len;i++){this->ptr[i] =other.ptr[i];}}cout<<"拷贝赋值"<<endl;return *this;
}
My_string::~My_string(){cout<<this->ptr<<"析构函数"<<endl;delete[] ptr;
}
bool My_string::Isvoid(){return this->len ==0 ? true:false;
}
void My_string::show(){for(int i=0;i<this->len;i++){cout<<*(this->ptr+i);}cout<<endl;
}
void My_string::push_back(char value){if(this->len < this->size-1){*(this->ptr+len++) = value;}else if(this->Add()){*(this->ptr+len++) = value;}
}
void My_string::pop_back(){this->len--;
}
char& My_string::at(int index){if(index<=this->len-1){return this->ptr[index];}else {cout<<"下标越界"<<endl;exit(EXIT_SUCCESS);}
}
void My_string::clear(){free(this->ptr);this->ptr = new char[this->size];this->ptr[0] = '\0';this->len = 0;
}
char* My_string::data(){return this->ptr;
}
int My_string::get_length(){return this->len;
}
int My_string::get_size(){return this->size;
}bool My_string::Add(){if(this->len == this->size-1){char *p = new char[size*2];strcpy(p,this->ptr);free(this->ptr);this->ptr = p;return true;}else return false;
}
main.cpp
#include "MyString.h"int main(){My_string s;cout<<"s:";s.show();My_string s1("hello");cout<<"s1:";s1.show();My_string s2(5,'A');cout<<"s2:";s2.show();My_string s3 = s2;cout<<"s3:";s3.show();s3 = s1;cout<<"s3:";s3.show();if(s3.Isvoid()){cout<<"s3空"<<endl;}else cout<<"s3非空"<<endl;cout<<"尾插:";s3.push_back('a');s3.show();cout<<"尾删:";s3.pop_back();s3.show();cout<<"查看下标4的值:"<<s3.at(4)<<endl;cout<<"清空s3函数"<<endl;s3.clear();cout<<"s3:";s3.show();cout<<"s1的C风格字符串:"<<s1.data()<<endl;cout<<"s1的实际长度:"<<s1.get_length()<<endl;cout<<"s1当前最大容量:"<<s1.get_size()<<endl;
}
运行结果
思维导图