c++实现简单的String类,计算长度,输入输出,*运算符重载,字符拼接

#include<iostream>
using namespace std;
//计算char*数组的长度
int strlen(const char *string)
{
const char *temp = string;
int length = 0;
while(string[length]!='\0')
{
length++;
}
return length;
}

//自定义的字符串类
class String
{
public:
//无参构造
String()
{
this->length = 0;
this->string = new char[1];
this->string[0] = '\0';
}
//有参构造,传char*还是打上const,不然一堆warning
String(const char*string)
{
this->length = strlen(string);
this->string = new char[length+1];
for(int i =0;i<=this->length;i++)
{
this->string[i] = string[i];
}
cout<<"String(char*string)"<<endl;
}
//析构函数,每次都要放掉所有指针变量
~String()
{
if(this->string!=NULL)
{
//有内容才释放,没有就算了
delete[] this->string;
this->string = NULL;
cout<<"~String()"<<endl;
}
}
//重载+号,让两个字符串相加,弄了挺久,要搞清char指针的原理
//我返回的仍是这个对象本身,也就是相加不改变指针位置
String& operator+(String& another)
{
//两个String相加形成新的String
if(this->string!=NULL)
{
char*temp = this->string;
this->string = new char[this->length+another.len()+1];
//先拷贝原有的字符串
for(int i = 0;i<this->length;i++)
{
this->string[i]=temp[i];
}
//拼接新来的字符串
int another_len = another.len();
for(int i = 0;i<=another_len;i++)
{
this->string[i+this->length]=another.string[i];
}
this->length = this->length+another.len();

delete[] temp;
return *this;
}
}
//重载*,打印拼接字符串
//可能是因为是匿名对象,还没弄得很妥当
//*****************************************
String operator*(int count)
{
int temp_len = (this->length)*count;
char * temp = new char[temp_len+1];
for(int i = 0;i<temp_len;i++)
{
temp[i] = (this->string)[i%(this->length)];
}
temp[temp_len] = '\0';
String a = String(temp);
return a;
}


//重载<<,打印string
friend ostream& operator<<(ostream& os,String &st);
//重载>>,终端输入赋值
friend istream& operator>>(istream& is,String &st);

//返回字符串长度
int len()
{
return this->length;
}


private:
char *string;
int length;
};
//cout
ostream& operator<<(ostream& os,String &st)
{
cout<<st.string;
return os;
}
//可以cin给string赋值
istream& operator>>(istream& is,String &st)
{
//如果原来的字符串有内容,就先干掉
if(st.string!=NULL)
{
delete[] st.string;
st.string = NULL;
st.length = 0;
}
//设置缓存
char temp[2048] = {0};
cout<<"输入字符串:"<<endl;
cin >>temp;
int len = strlen(temp);
st.string = new char[len+1];
//拷贝字符串
for(int i = 0;i<=len;i++)
{
st.string[i] = temp[i];
}
st.length = len;
}

int main(void)
{
String aa("hello");
cout<<"aa:"<<aa<<endl;
String bb(" world!");
cout<<"bb:"<<bb<<endl;
aa = aa+bb+bb;
aa.len();
cout<<"aa:"<<aa<<endl;
cout<<sizeof(aa)<<endl;
cout<<strlen("hehe")<<endl;
cin>>bb;
cout<<bb<<endl;
String cc("-");
String dd = cc*10;
cout<<dd<<endl;
//暂时不知道为什么像下面那么写是错的
//cout<<(cc*2)<<endl;
return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值