my_string.h
# ifndef MY_STRING_H
# define MY_STRING_H # include <iostream>
# include <cstring> using namespace std; class My_string
{
private : char * ptr; int size; int len; public : My_string ( ) : size ( 20 ) { cout<< "****************无参构造***********" << endl; this -> ptr = new char [ size] ; this -> ptr[ 0 ] = '\0' ; this -> len = 0 ; } My_string ( const char * src) { cout<< "****************一个参数有参构造***********" << endl; this -> len = strlen ( src) ; this -> size = len + 1 ; this -> ptr = new char [ size] ; strcpy ( this -> ptr, src) ; } My_string ( int num, char value) { cout<< "****************两个参数有参构造***********" << endl; this -> len = num; this -> size = len + 1 ; this -> ptr = new char [ len+ 1 ] ; int i= 0 ; while ( i< num) { this -> ptr[ i] = value; i++ ; } this -> ptr[ num] = '\0' ; } My_string ( const My_string & other) { cout<< "****************拷贝构造***********" << endl; len = other. len; size = other. size; ptr = new char [ size] ; strcpy ( ptr, other. ptr) ; } My_string & operator = ( const My_string & other) { cout<< "****************拷贝赋值***********" << endl; if ( this == & other) { return * this ; } delete [ ] ptr; this -> len = other. len; this -> size = other. size; this -> ptr = new char [ size] ; strcpy ( ptr, other. ptr) ; return * this ; } ~ My_string ( ) { cout<< "****************析构函数***********" << endl; delete [ ] this -> ptr; } void show ( ) ; void isempty ( ) ; void isfull ( ) ; void push_back ( char value) ; void pop_back ( ) ; char & at ( int index) ; void clear ( ) ; char * data ( ) ; int get_length ( ) ; int get_size ( ) ; void resize ( ) ; } ; # endif
my_string.cpp
# include "my_string.h"
# include <cstring>
void My_string :: show ( ) { cout<< ptr<< endl;
}
void My_string :: isempty ( ) { if ( this -> len== 0 ) { cout<< "字符串为空" << endl; } return ;
}
void My_string :: isfull ( ) { if ( this -> len>= this -> size) { cout<< "字符串满" << endl; resize ( ) ; cout<< "重新分配空间" << endl; } else { cout<< "字符串未满" << endl; } return ;
}
void My_string :: push_back ( char value) { this -> isfull ( ) ; this -> ptr[ len] = value; len++ ; ptr[ len] = '\0' ;
}
void My_string :: pop_back ( ) { this -> len= this -> len- 1 ; ptr[ len] = '\0' ;
}
char & My_string :: at ( int index) { return ptr[ index] ;
}
void My_string :: clear ( ) { 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;
}
void My_string :: resize ( ) { size *= 2 ; char * new_ptr = new char [ size] ; strcpy ( new_ptr, ptr) ; delete [ ] ptr; ptr = new_ptr; }
main.cpp
# include "my_string.h" int main ( ) { My_string p1; My_string p2 ( "hello" ) ; p2. show ( ) ; My_string p3 ( 5 , 'A' ) ; p3. show ( ) ; My_string p4 = p2; p4. show ( ) ; p3= p2; p3. show ( ) ; p2. show ( ) ; cout<< "p2的第3个字符" << p2. at ( 3 ) << endl; cout<< "p2C风格的字符串" << p2. data ( ) << endl; p2. isfull ( ) ; cout<< "p2的最大长度:" << p2. get_size ( ) << endl; cout<< "p2现在的长度:" << p2. get_length ( ) << endl; p2. clear ( ) ; p2. show ( ) ; p2. push_back ( 'W' ) ; p2. show ( ) ; p2. pop_back ( ) ; p2. show ( ) ; }