详解C++中实现继承string类的MyString类的步骤

2020-01-06 15:03:06刘景俊

在使用这个方法以前,那么对象肯定至少已经通过调用构造函数数据成员有了一定的值。所以这个时候我们首先判断两个对象是否
相等。相等的话返回原对象,如果不等:
那么两个对象的字符串长度肯定不同。所以我们先释放原字符串内存空间,然后根据赋值对象的字符串长度分配内存空间并把字符
串内存拷贝过去。
3.字符串处理的几个函数:


size_t MyString::getsize(MyString &str) 
{ 
 return strlen(str.string); 
} 
void MyString::clear() 
{ 
 length = 0; 
 while(string!='/0') 
 *string ='/0'; 
} 
bool MyString::empty() 
{ 
 return strlen(string)==0; 
} 
int MyString ::compare(const MyString &str) 
{ 
  return compare(string,str.string); 
} 
void MyString::swap(MyString &str) 
{ 
  char *temp; 
  temp = string; 
  string = str.string; 
  str = temp; 
} 
Mystring MyString::substr(sizez_t pos=0,size_t n )const 
{ 
  MyString string; 
  delete[]string.string; 
  if(n>length) 
  { 
   string.length = length; 
   string.string = new char[length+1]; 
   memcpy(string.string,string,length+1); 
    return string; 
  } 
  length = n; 
  string.string = new char[length+1]; 
  memcpy(string.string,string,length+1); 
  return string; 
} 

注意的几个问题:
1)在这几个函数的实现中,我们可以直接调用c语言中几个对字符串处理的<string.h>函数进行实现
2)clear()函数中注意,只是把每个内存区域的字符置为0,并不能通过delete[]来释放内存空间,这样很容易和析构函数一起造成
两次释放内存空间引起错误。
3)swap()实现交换的这个函数中,我们可以直接定义中间变量指针实现,不用重新分配内存空间全部进行转存,这个对于析构函数
的析构没有影响。
4.友元函数:


friend bool operator==(const MyString &str1,const MyString &str2) 
 
  return strcmp(str1.string,str2.string)==0; 
 
friend MyString operator+(const MyString &str1,const MyString &str2) 
{ 
  MyString mystring; 
  char *dest; 
  dest = new char[str1.length+str2.length+1]; 
  memcpy(dest,str1.string,str1.length); 
  memcpy(dest+str1.length,str2.string,str2.length+1); 
  delete[]mystring.string; 
  mystring.string = dest; 
  mystring.length = str1.length+str2.length; 
  return mystring; 
} 
friend ostream &operator<<(ostream &os,const MyString &str) 
{ 
  os<<str.string; 
  return os; 
} 

注意的问题和上面差不多,这里就不重复了~~~
其他几个函数实现都基本雷同~



注:相关教程知识阅读请移步到C++教程频道。