仿照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) { 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[ 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;
}
运行结果
思维导图