//mystring类的拷贝和构造函数 ,重载符号和操作符。
#include<iostream>
#include<cstring>
using namespace std;
//C中没有字符串 字符串类(c风格的字符串)
//空串“ ”;
class mystring
{
private:
int m_len;
char *m_p;
public:
mystring()
{
m_len=0;
m_p=new char[m_len+1];
strcpy(m_p," ");
}
mystring(const char *p)
{
if(p==NULL)
{
m_len=0;
m_p=new char[m_len+1];
strcpy(m_p," ");
}
else
m_len=strlen(p);
m_p=new char[m_len+1];
strcpy(m_p,p);
}
//拷贝构造函数
mystring(const mystring& s)
{
m_len=s.m_len ;
m_p=new char[m_len +1];
strcpy(m_p,s.m_p );
}
~mystring()
{
if(m_p!=NULL)
{
delete [] m_p;
m_p=NULL;
m_len=0;
}
}
mystring& operator=(const char *p)//实现主函数的 s4="22222222";效果
{
//旧内存释放掉
if(m_p!=NULL)
{
delete [] m_p;
m_len=0;
}
//根据p分配内存
if(p==NULL)
{
m_len=0;
m_p=new char[m_len+1];
strcpy(m_p,"");
}
else
{
m_len=strlen(p);
m_p=new char [m_len +1];
strcpy(m_p,p);
}
return *this;//必须返回一个函数引用
}
mystring& operator=(const mystring &s)//s4=s2;
{
//旧内存释放掉
if(m_p!=NULL)
{
delete [] m_p;
m_len=0;
}
//根据s分配内存,不过这个与上面不用的是这个至少是个空串,所以不用判断是不是空
m_len=s.m_len ;
m_p=new char(m_len+1);
strcpy(m_p,s.m_p );
return *this;
}
char& operator [](int index)//修改s4这个数组的某一个字符
{
return m_p[index];
}
ostream& operator<<(ostream& out,mystring &s)
{
out<<s.m_p ;
return out;
} ;
int main()
{
mystring s1;
mystring s2("s2");
mystring s2_2=NULL;
mystring s3=s2;
mystring s4="ssssssss";
//测试运算符重载 和重载【】;
s4=s2;
s4="2222222222"; //这两个是等号操作符,对应两个函数原型、
s4[1]='4';
printf("%c",s4[1]);//输出结果是4
cout<<s4<<endl;
ostream& operator<<(ostream& out,mystring &s);
//下面两个重载等号操作符
//char& operator [](int index);返回的是某一个字符
//ostream& operator<<(ostream& out,mystring &s); 返回的是整个字符串 ,重载左移操作符。
//mystring & operator=(const char *p);
//mystring & operator=(const mystring &s);//用一个对象初始化另一个对象
cout<<"hello"<<endl;
return 0;
}
mystring类初探
最新推荐文章于 2023-05-14 19:21:52 发布