# 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  # 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 ; 
} # 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; 
}