.h
#ifndef STRING1_H_
#define STRING1_H_
#include <iostream>
using std:: ostream;
using std:: istream;
class String
{
private :
char * str;
int len;
static const int CINLIM = 80 ;
public :
String ( const char * s) ;
String ( ) ;
String ( const String & st) ;
~ String ( ) ;
String & operator = ( const String & st) ;
String & operator = ( const char * s) ;
String operator + ( const String & st) ;
String & operator + = ( const String & st) ;
char & operator [ ] ( int i) ;
const char & operator [ ] ( int i) const ;
friend bool operator < ( const String & st1, const String & st2) ;
friend bool operator > ( const String & st1, const String & st2) ;
friend bool operator == ( const String & st1, const String & st2) ;
friend std:: ostream & operator << ( std:: ostream & os, const String & st) ;
friend std:: istream & operator >> ( std:: istream & is, String & st) ;
} ;
#endif
#pragma once
.cpp
#pragma warning( disable : 4996)
#include <cstring>
#include "string.h"
using std:: cout;
using std:: cin;
String:: String ( const char * s)
{
len = std:: strlen ( s) ;
str = new char [ len + 1 ] ;
strcpy_s ( str, std:: strlen ( s) + 1 , s) ;
}
String:: String ( )
{
len = 0 ;
str = new char [ 1 ] ;
str[ 0 ] = '\0' ;
}
String:: String ( const String & st)
{
len = st. len;
str = new char [ len + 1 ] ;
strcpy_s ( str, std:: strlen ( st. str) + 1 , st. str) ;
}
String:: ~ String ( )
{
delete [ ] str;
}
String & String:: operator = ( const String & st)
{
if ( this == & st)
return * this ;
delete [ ] str;
len = st. len;
str = new char [ len + 1 ] ;
strcpy_s ( str, std:: strlen ( st. str) + 1 , st. str) ;
return * this ;
}
String & String:: operator = ( const char * s)
{
delete [ ] str;
len = std:: strlen ( s) ;
str = new char [ len + 1 ] ;
strcpy_s ( str, std:: strlen ( s) + 1 , s) ;
return * this ;
}
String String:: operator + ( const String& st)
{
String newString;
newString. len = strlen ( str) + strlen ( st. str) ;
newString. str = new char [ newString. len + 1 ] ;
strcpy_s ( newString. str, std:: strlen ( str) + 1 , str) ;
strcat ( newString. str, st. str) ;
return newString;
}
String & String:: operator + = ( const String& st)
{
len = strlen ( str) + strlen ( st. str) ;
char * newData = new char [ len + 1 ] ;
strcpy_s ( newData, strlen ( str) + 1 , str) ;
strcat ( newData, st. str) ;
delete [ ] str;
str = newData;
return * this ;
}
char & String:: operator [ ] ( int i)
{
try {
if ( i > strlen ( str) )
{
throw "invalid index" ;
}
else
return str[ i] ;
}
catch ( const char * str1)
{
cout << str1;
}
}
const char & String:: operator [ ] ( int i) const
{
return str[ i] ;
}
bool operator < ( const String & st1, const String & st2)
{
return ( std:: strcmp ( st1. str, st2. str) < 0 ) ;
}
bool operator > ( const String & st1, const String & st2)
{
return st2 < st1;
}
bool operator == ( const String & st1, const String & st2)
{
return ( std:: strcmp ( st1. str, st2. str) == 0 ) ;
}
std:: ostream & operator << ( std:: ostream & os, const String & st)
{
os << st. str;
return os;
}
std:: istream & operator >> ( std:: istream & is, String & st)
{
char temp[ String:: CINLIM] ;
is. get ( temp, String:: CINLIM) ;
if ( is)
{
st = temp;
}
while ( is && is. get ( ) != '\n' )
continue ;
return is;
}
测试
#include "string.h"
using namespace std;
int main ( )
{
String s1;
String s2 = "123" ;
String s3 ( "456" ) ;
String s4 = s2;
String s5 ( s3) ;
s5 = s2;
String s6 = s2 + s3;
s6 + = s2;
cout << ( s2 == s3) << endl;
cout << ( s4 == s2) << endl;
cout << s6[ 100 ] << endl;
s6[ 8 ] = '5' ;
cout << "s6[8]: " << s6[ 8 ] << endl;
cout << s2;
return 0 ;
}