//str.h
#include<iostream>
#ifndef _STR_H
#define _STR_H
class CStr...{
public:
CStr();
CStr(const char*);
CStr(int,char);
CStr(const CStr&);
~CStr();
public:
const char* c_str();
int length();
public:
char& operator[](int);
bool operator==(CStr&);
CStr& operator=(const CStr&);
const CStr operator+(const CStr&);
const CStr& operator+=(const CStr&);
friend std::ostream& operator<<(std::ostream&,CStr&);
friend std::istream& operator>>(std::istream&,CStr&);
private:
char *m_str;
int m_len;
};
#endif
#include<iostream>
#ifndef _STR_H
#define _STR_H
class CStr...{
public:
CStr();
CStr(const char*);
CStr(int,char);
CStr(const CStr&);
~CStr();
public:
const char* c_str();
int length();
public:
char& operator[](int);
bool operator==(CStr&);
CStr& operator=(const CStr&);
const CStr operator+(const CStr&);
const CStr& operator+=(const CStr&);
friend std::ostream& operator<<(std::ostream&,CStr&);
friend std::istream& operator>>(std::istream&,CStr&);
private:
char *m_str;
int m_len;
};
#endif
这个字符串类包含了一些最基本的东西,下面是各个成员函数及重载操作符的实现:
#include"str.h"
CStr::CStr():m_str(NULL),m_len(0)
...{
}
CStr::CStr(const char *p)
...{
int size=0;
const char *t=p;
while(*t++)
++size;
m_str=new char[size+1];
m_len=size;
memcpy(m_str,p,size+1);
}
CStr::CStr(int n,char ch)
...{
m_len=n;
m_str=new char[m_len+1];
m_str[m_len]=0;
memset(m_str,ch,m_len);
}
CStr::CStr(const CStr &s)
...{
m_str=new char[s.m_len+1];
m_len=s.m_len;
memcpy(m_str,s.m_str,m_len+1);
}
CStr::~CStr()
...{
if(m_str)
delete[] m_str;
}
const char* CStr::c_str()
...{
return m_str;
}
bool CStr::operator==(CStr &s)
...{
for(int i=0;i!=m_len;++i)...{
if(*(m_str+i)!=*(s.m_str+i))
return false;
}
return true;
}
CStr& CStr::operator=(const CStr &s)
...{
if(this==&s)
return *this;
delete[] m_str;
m_len=s.m_len;
m_str=new char[m_len+1];
memcpy(m_str,s.m_str,m_len+1);
return *this;
}
const CStr CStr::operator+(const CStr &s)
...{
char *p=new char[m_len+s.m_len+1];
memcpy(p,m_str,m_len);
memcpy(p+m_len,s.m_str,s.m_len+1);
CStr str(p);
delete[] p;
return str;
}
std::ostream& operator<<(std::ostream &out,CStr &s)
...{
out<<s.m_str;
return out;
}
std::istream& operator>>(std::istream &in,CStr &s)
...{
if(s.m_str)...{
delete[] s.m_str;
s.m_len=0;
}
char buf[1024];
in>>buf;
while(buf[s.m_len])...{
++s.m_len;
}
s.m_str=new char[s.m_len+1];
memcpy(s.m_str,buf,s.m_len+1);
return in;
}
char& CStr::operator[](int n)
...{
return m_str[n];
}
const CStr& CStr::operator+=(const CStr &s)
...{
*this=*this+s;
return *this;
}
CStr::CStr():m_str(NULL),m_len(0)
...{
}
CStr::CStr(const char *p)
...{
int size=0;
const char *t=p;
while(*t++)
++size;
m_str=new char[size+1];
m_len=size;
memcpy(m_str,p,size+1);
}
CStr::CStr(int n,char ch)
...{
m_len=n;
m_str=new char[m_len+1];
m_str[m_len]=0;
memset(m_str,ch,m_len);
}
CStr::CStr(const CStr &s)
...{
m_str=new char[s.m_len+1];
m_len=s.m_len;
memcpy(m_str,s.m_str,m_len+1);
}
CStr::~CStr()
...{
if(m_str)
delete[] m_str;
}
const char* CStr::c_str()
...{
return m_str;
}
bool CStr::operator==(CStr &s)
...{
for(int i=0;i!=m_len;++i)...{
if(*(m_str+i)!=*(s.m_str+i))
return false;
}
return true;
}
CStr& CStr::operator=(const CStr &s)
...{
if(this==&s)
return *this;
delete[] m_str;
m_len=s.m_len;
m_str=new char[m_len+1];
memcpy(m_str,s.m_str,m_len+1);
return *this;
}
const CStr CStr::operator+(const CStr &s)
...{
char *p=new char[m_len+s.m_len+1];
memcpy(p,m_str,m_len);
memcpy(p+m_len,s.m_str,s.m_len+1);
CStr str(p);
delete[] p;
return str;
}
std::ostream& operator<<(std::ostream &out,CStr &s)
...{
out<<s.m_str;
return out;
}
std::istream& operator>>(std::istream &in,CStr &s)
...{
if(s.m_str)...{
delete[] s.m_str;
s.m_len=0;
}
char buf[1024];
in>>buf;
while(buf[s.m_len])...{
++s.m_len;
}
s.m_str=new char[s.m_len+1];
memcpy(s.m_str,buf,s.m_len+1);
return in;
}
char& CStr::operator[](int n)
...{
return m_str[n];
}
const CStr& CStr::operator+=(const CStr &s)
...{
*this=*this+s;
return *this;
}