博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
String:基本实现
阅读量:6819 次
发布时间:2019-06-26

本文共 6610 字,大约阅读时间需要 22 分钟。

这是最基本的String的实现

/*
 * The basic implementation of String
 
*/
#include <iostream>
#include <cstring>
#include <iomanip>
using std::istream;
using std::ostream;
using std::cout;
using std::endl;
using std::cin;
using std::setw;
class String{
    
public:
        friend istream& 
operator>>(istream&,String&);
        friend ostream& 
operator<<(ostream&,
const String&);
        friend String 
operator+(
const String&,
const String&);
        friend String 
operator+(
const String&,
const 
char*);
    
public:
        String():_string(
0),_size(
0){}
        String(
int,
char);
        String(
const 
char*);
        String(
const String&);
        ~String(){delete[] _string;}
        String& 
operator=(
const String&);
        String& 
operator=(
const 
char*);
        String& 
operator+=(
const String&);
        String& 
operator+=(
const 
char*);
        String& 
operator+=(
const 
char&);
        
bool 
operator==(
const String &)
const;
        
bool 
operator!=(
const String &)
const;
        
bool 
operator>(
const String &)
const;
        
bool 
operator>=(
const String &)
const;
        
bool 
operator<(
const String &)
const;
        
bool 
operator<=(
const String &)
const;
        
bool 
operator==(
const 
char*)
const;
        
bool 
operator!=(
const 
char*)
const;
        
bool 
operator>(
const 
char*)
const;
        
bool 
operator>=(
const 
char*)
const;
        
bool 
operator<(
const 
char*)
const;
        
bool 
operator<=(
const 
char*)
const;
        
char 
operator[](
int)
const;
//
        
int size(){
return _size;}
    
private:
        
char* _string;
        
int _size;
};
istream& 
operator>>(istream& 
is,String& str){
    
const 
int limit_string_size=
4096;
    
char inBuf[limit_string_size];
    
is>>setw(limit_string_size)>>inBuf;
    str=inBuf;
    
return 
is;
}
ostream& 
operator<<(ostream& os,
const String& str){
    os<<str._string;
    
return os;
}
String::String(
int n,
char ch) {
    _string=
new 
char[n+
1];
    
for(
int i=
0;i<n;i++)
        _string[i]=ch;
    _string[n]=
'
\0
';
    _size=n;
}
String::String(
const 
char* str) {
    
if(!str){
        _size=
0;
        _string=NULL;
    }
    
else{
        _size=strlen(str);
        _string=
new 
char[_size+
1];
        strcpy(_string,str);
    }
}
String::String(
const String& str) {
    _size=str._size;
    
if(!str._string)
        _string=
0;
    
else{
        _string=
new 
char[_size+
1];
        strcpy(_string,str._string);
    }
}
String& String::
operator=(
const String& str) {
    
if(
this!=&str){
        
if(_size==str._size){
            strcpy(_string,str._string);
        }
        
else{
            _size=str._size;
                delete[] _string;
            
if(!str._string)
                _string=NULL;
            
else{
                _string=
new 
char[_size+
1];
                strcpy(_string,str._string);
            }
        }
    }
    
return *
this;
}
String& String::
operator=(
const 
char*str) {
    
if(!str){
        _size=
0;
        
if(_string)
            delete[] _string;
        _string=NULL;
    }
    
else{
        _size=strlen(str);
            delete[] _string;
        _string=
new 
char[_size+
1];
        strcpy(_string,str);
    }
    
return *
this;
}
String& String::
operator+=(
const String& str) {
    
if(str._size==
0)
        
return *
this;
            _size+=str._size;
    
char* buf=
new 
char[_size+
1];
    strcpy(buf,_string);
        delete[] _string;
    strcat(buf,str._string);
    _string=buf;
    
return *
this;
}
String& String::
operator+=(
const 
char* str) {
    
if(!str)
        
return *
this;
    size_t len=strlen(str);
    _size+=len;
    
char* buf=
new 
char[_size+
1];
    strcpy(buf,_string);
        delete[] _string;
    strcat(buf,str);
    _string=buf;
    
return *
this;
}
String& String::
operator+=(
const 
char& c) {
    _size+=
1;
    
char* buf=
new 
char[_size+
1];
    strcpy(buf,_string);
    delete[] _string;
    buf[_size-
1]=c;
    _string=buf;
    
return *
this;
}
bool String::
operator==(
const String& str)
const {
    
if(_size!=str._size)
        
return 
false;
    
else
        
return strcmp(_string,str._string)==
0?
true:
false;
}
bool String::
operator!=(
const String& str)
const{
    
return !(*
this==str);
}
bool String::
operator>(
const String& str)
const{
    
return  strcmp(_string,str._string)>
0;
}
bool String::
operator>=(
const String& str)
const{
    
return  strcmp(_string,str._string)>=
0;
}
bool String::
operator<(
const String& str)
const{
    
return  strcmp(_string,str._string)<
0;
}
bool String::
operator<=(
const String& str)
const{
    
return  strcmp(_string,str._string)<=
0;
}
bool String::
operator==(
const 
char* str)
const {
    
return strcmp(_string,str)==
0?
true:
false;
}
bool String::
operator!=(
const 
char* str)
const {
    
return strcmp(_string,str)!=
0?
true:
false;
}
bool String::
operator>(
const 
char* str)
const {
    
return strcmp(_string,str)>
0?
true:
false;
}
bool String::
operator>=(
const 
char* str)
const {
    
return strcmp(_string,str)>=
0?
true:
false;
}
bool String::
operator<(
const 
char* str)
const {
    
return strcmp(_string,str)<
0?
true:
false;
}
bool String::
operator<=(
const 
char* str)
const {
    
return strcmp(_string,str)<=
0?
true:
false;
}
char String::
operator[](
int n)
const {
    
if(n>=
0&&n<_size)
        
return _string[n];
    
else
        
return -
1;
}
String 
operator+(
const String&str1,
const String& str2) {
    String newstr;
    
if(str1._size==
0&&str2._size==
0)
        
return newstr;
    
else 
if(str1._size==
0&&str2._size!=
0){
        newstr=str2;
    }
    
else 
if(str1._size!=
0&&str2._size==
0){
        newstr=str1;
    }
    
else{
        newstr._size=str1._size+str2._size;
        newstr._string=
new 
char[newstr._size+
1];
        strcpy(newstr._string,str1._string);
        strcat(newstr._string,str2._string);
    }
    
return newstr;
}
String 
operator+(
const String&str1,
const 
char*str2) {
    String newstr;
    size_t len=strlen(str2);
    
if(str1._size==
0&&len==
0)
        
return newstr;
    
else 
if(str1._size==
0&&len!=
0){
        newstr=str2;
    }
    
else 
if(str1._size!=
0&&len==
0){
        newstr=str1;
    }
    
else{
        newstr._size=str1._size+len;
        newstr._string=
new 
char[newstr._size+
1];
        strcpy(newstr._string,str1._string);
        strcat(newstr._string,str2);
    }
    
return newstr;
}
int main()
{
    
int aCnt = 
0, eCnt = 
0, iCnt = 
0, oCnt = 
0, uCnt = 
0,
        theCnt = 
0, itCnt = 
0, wdCnt = 
0, notVowel = 
0;
    
//
 为了使用 operator==( const char* )
    
//
 我们并不定义 The( "The" )和 It( "It" )
    String buf, the( 
"
the
" ), it( 
"
it
" );
    
//
 调用 operator>>( istream&, String& )
    
while ( cin >> buf ) {
        ++wdCnt;
        
//
 调用 operator<<( ostream&, const String& )
        cout << buf << 
'
 
';
        
if ( wdCnt % 
12 == 
0 )
            cout << endl;
        
//
 调用 String::operator==(const String&) and
        
//
        
if ( buf == the || buf == 
"
The
" )
            ++theCnt;
        
if ( buf == it || buf == 
"
It
" )
                ++itCnt;
        
//
 调用 String::size()
        
for ( 
int ix = 
0; ix < buf.size(); ++ix )
        {
            
//
 调用 String::operator[](int)
            
switch( buf[ ix ] )
            {
                
case 
'
a
'
case 
'
A
': ++aCnt;
                                    
break;
                
case 
'
e
'
case 
'
E
': ++eCnt;
                                    
break;
                
case 
'
i
'
case 
'
I
': ++iCnt;
                                    
break;
                
case 
'
o
'
case 
'
O
': ++oCnt;
                                    
break;
                
case 
'
u
'
case 
'
U
': ++uCnt;
                                    
break;
                
default: ++notVowel; 
break;
            }
        }
    }
    
//
 调用 operator<<( ostream&, const String& )
    cout << 
"
\n\n
"
        <<
"
Words read: 
" << wdCnt << 
"
\n\n
"
        <<
"
the/The: 
" << theCnt << 
'
\n
'
        <<
"
it/It: 
" << itCnt << 
"
\n\n
"
        <<
"
non-vowels read: 
" << notVowel << 
"
\n\n
"
        <<
"
a: 
" << aCnt << 
'
\n
'
        <<
"
e: 
" << eCnt << 
'
\n
'
        <<
"
i: 
" << iCnt << 
'
\n
'
        <<
"
o: 
" << oCnt << 
'
\n
'
        <<
"
u: 
" << uCnt << endl;
    String a=
"
hello
";
    String b=
"
world
";
    String c=a+b;
    cout<<c<<endl;
    
return 
0;
}

转载于:https://www.cnblogs.com/xkfz007/archive/2012/08/24/2653805.html

你可能感兴趣的文章
我的友情链接
查看>>
路由器的密码恢复
查看>>
linux yum命令详解
查看>>
java 多线程暂停与恢复:suspend,resume
查看>>
Jquery 获得<input type="text" id="test">中的value
查看>>
《Android开发从零开始》——38.WebView控件学习
查看>>
Windows Server 2012 Hyper-V PK VMware 性能
查看>>
IOS 手写控件 简单播放器 AVFoundation音乐播放
查看>>
FPGA设计——图像处理(均值滤波)
查看>>
Windows7无法访问共享文件夹(0x800704cf,0x80070035)解决方法
查看>>
ubuntu 个人使用技巧
查看>>
android JNI使用chdir来改变当前目录
查看>>
局域网络必备-mac地址修改
查看>>
Linux学习之逻辑卷管理
查看>>
about asm in linux
查看>>
我的友情链接
查看>>
通过Power Shell 管理Office 365
查看>>
ECMAScript 语法
查看>>
Flex 数据类型学习总结
查看>>
Linux下DNS服务,相关配置文件关系(刚刚学来的展示一下)
查看>>