您的位置:首页 > 其它

自己动手实现一个简单的String类

2010-02-07 19:16 696 查看
定义一个基本的
String



class
String

{

public
:

String():base(" "
){}

private
:

char
*
base;

long
int
length;

}
;

我们可以看到在这个类里面我们用一个char
型指针来保存字符串值,long int
型值length
来保存字符串的长度。



由于我们知道string

支持这样的构造函数:

string str(
“hello”);

string
str(5,’c’);

string
str1(str,2);

string
str2(str,0,2);

故我们给我们的String

添加相应的构造函数:

class
String

{

public
:

String():base(""
),length(0){}

String(const
char
*
p)

{

if
(p ==
NULL)

{

base =
new
char
[1];

base =
'/0'
;

}

else

{

base =
new
char
[strlen(p)+
1];

strcpy(base,p);

}

length =
strlen(p);

}

String(int
count,char
ch)

{

base =
new
char
[count+
1];

for
(int
i=
0;
i<
count; i++
)

{

base[i] =
ch;

}

base[++
i]
=
'/0'
;

length =
count;

}

String(String&
str,int
count)

{

base =
new
char
[count+
1];

strncpy(base,str.
base,count);

base[count] =
'/0'
;

length =
count;

}

String(String&
str,int
index,int
count)

{

base =
new
char
[count+
1];

for
(int
i=
index,j=
0; i<
count+
index; i++
)

{

base[j++
] =
str.
base[i];

}

base[j] =
'/0'
;

length =
count;

}

private
:

char
*
base;

long
int
length;

}
;



为类添加拷贝构造函数和析构函数

拷贝构造函数:

String(const
String &
str)

{

base =
new
char
[str.
length+
1];

strcpy(base,str.
base);

}

注意这里的拷贝构造函数的形参是定义为const
,为什么要定义为const
呢?是因为要既能
接收const
实参,又能接受非const

参。若是我们定义为非const
,则无法接受const

参了。那为什么我们不定义函数重载呢。那是一个类只能有一个复制构造函数啦。

析构函数:

~
String()

{

if
(length !=
0)//
防止空串情况。

delete
base;

}



string

类里面的操作符重载

输出操作符
(“<<”):

friend
ostream&
operator
<<
(ostream&
os,const
String &
str)

{

return
os <<
str.
base;

}

定义为友元函数。

输入操作符
(“>>”)
:

#define
STR_SIZE 1024

friend
istream&
operator
>>
(istream&
is,String &
str)

{

str.
base =
new
char
[STR_SIZE];

return
is >>
str.
base;

}


(“+=”)

操作符
:

String&
operator
+=
(const
String&
str)

{

char
*
s =
new
char
[length+
1];

strcpy(s,base);

base =
new
char
[length+
str.
length+
1];

strcpy(base,s);

strcat(base,str.
base);

length +=
str.
length;

return
*
this
;

}

String&
operator
+=
(const
char
*
p)

{

char
*
s =
new
char
[length+
1];

strcpy(s,base);

base =
new
char
[length+
strlen(p)+
1];

strcpy(base,s);

strcat(base,p);

length +=
strlen(p);

return
*
this
;

}

String&
operator
+=
(const
char
p)

{

char
*
s =
new
char
[length+
1];

strcpy(s,base);

base =
new
char
[length+
2];

strcpy(base,s);

base[length] =
p;

base[length+
1] =
'/0'
;

length +=
1;

return
*
this
;

}


(“+”)
操作符

friend
String operator
+
(String&
str1,const
String&
str2)

{

String ret(str1);

ret +=
str2;

return
ret;

}

friend
String operator
+
(String&
str1,const
char
*
p)

{

String ret(str1);

ret +=
p;

return
ret;

}

friend
String operator
+
(String&
str1,const
char
p)

{

String ret(str1);

ret +=
p;

return
ret;

}

赋值
(“=”)
操作符

String&
operator
=
(const
String&
str2)

{

base =
new
char
[str2.
length+
1];

strcpy(base,str2.
base);

length =
str2.
length;

return
*
this
;

}

String&
operator
=
(const
char
*
p)

{

base =
new
char
[strlen(p)+
1];

strcpy(base,p);

length =
strlen(p);

return
*
this
;

}

String&
operator
=
(const
char
p)

{

base =
new
char
[2];

base[0] =
p;

base[1] =
'/0'
;

return
*
this
;

}

关系操作符重载:

相等
(“==”)
操作符
:

friend
bool
operator
==
(const

String&
str1,const
String&
str2)

{

int
result =
strcmp(str1.
base,str2.
base);

if
(result !=
0)

{

return
false
;

}

else

{

return
true
;

}

}

friend
bool
operator
==
(const

String&
str1,const
char
*
p)

{

int
result =
strcmp(str1.
base,p);

if
(result !=
0)

{

return
false
;

}

else

{

return
true
;

}

}

不等
(“!=”)
操作符
:

friend
bool
operator
!=
(const

String&
str1,const
String&
str2)

{

return
!
(str1
==
str2);

}

friend
bool
operator
!=
(const

String&
str1,const
char
*
p)

{

return
!
(str1
==
p);

}

小于
(“<”):

friend
bool
operator
<
(const
String&
str1,const
String&
str2)

{

int
result =
strcmp(str1.
base,str2.
base);

if
(result <
0)

{

return
true
;

}

else

{

return
false
;

}

}

friend
bool
operator
<
(const
String&
str1,const
char
*
p)

{

int
result =
strcmp(str1.
base,p);

if
(result <
0)

{

return
true
;

}

else

{

return
false
;

}

}

大于
(“>”)
操作符:

friend
bool
operator
>
(const
String&
str1,const
String&
str2)

{

int
result =
strcmp(str1.
base,str2.
base);

if
(result >
0)

{

return
true
;

}

else

{

return
false
;

}

}

friend
bool
operator
>
(const
String&
str1,const
char
*
p)

{

int
result =
strcmp(str1.
base,p);

if
(result >
0)

{

return
true
;

}

else

{

return
false
;

}

}

小于等于
(“<=”)


friend
bool
operator
<=
(const
String&
str1,const
String&
str2)

{

int
result =
strcmp(str1.
base,str2.
base);

if
(result <=
0)

{

return
true
;

}

else

{

return
false
;

}

}

friend
bool
operator
<=
(const
String&
str1,const
char
*
p)

{

int
result =
strcmp(str1.
base,p);

if
(result <=
0)

{

return
true
;

}

else

{

return
false
;

}

}

大于等于
(“>=”):

friend
bool
operator
>=
(const
String&
str1,const
String&
str2)

{

int
result =
strcmp(str1.
base,str2.
base);

if
(result >=
0)

{

return
true
;

}

else

{

return
false
;

}

}

friend
bool
operator
>=
(const
String&
str1,const
char
*
p)

{

int
result =
strcmp(str1.
base,p);

if
(result >=
0)

{

return
true
;

}

else

{

return
false
;

}

}

下标
(“[]”)
操作符
:

char
operator
[](int
index)

{

return
base[index];

}

String
类的常用成员函数:

得到长度
:

long
int

Length()

{

return
length;

}

判断是否为空串
:

bool
empty()

{

if
(length ==
0)

{

return
true
;

}

else

{

return
false
;

}

}

判断大小函数
:

long
int

size()

{

return
length*
sizeof
(char
);

}

字串操作
:

String substr(long
int
pos,long
int
n)

{

String ret;

ret.
base =
new
char
[n+
1];

for
(int
i=
pos,j=
0; i <
pos+
n;
++
i,++
j)

{

ret.
base[j] =

base[i];

}

ret.
base[j] =
'/0'
;

ret.
length =
n;

return
ret;

}

String substr(long
int
pos)

{

String ret;

ret.
length =
length-
pos+
1;

ret.
base =
new
char
[ret.
length];

for
(int
i=
pos,j=
0; i<
length; ++
i,++
j)

{

ret.
base[j] =

base[i];

}

ret.
base[j] =
'/0'
;

return
ret;

}

String substr()

{

String ret;

ret.
base =
new
char
[length+
1];

strcpy(ret.
base,base);

ret.
length =
length;

return
ret;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: