c++ 實現Sring類

  1. 深拷貝實現string類

#define _CRT_SECURE_NO_WARNING 1
#include<iostream>
#include<string>
using namespace std;
class String
{
public:
 friend ostream&operator << (ostream &os, String &str);
 friend String operator+(const String &str1, const String &str2);  //雙目運算符重載爲友元函數
 String()      //默認構造函數
  :_size(0)
 {
  _str = new char[1];
  *_str = '\0';
 }
 char *my_strcpy(char *dest, const char *src)
 {
  char *tmp = dest;
  while (*src)
  {
   *dest = *src;
   dest++;
   src++;
  }
  *dest = '\0';
  return tmp;
 }
 int my_strlen(const char *str1)
 {
  int count = 0;
  while (*str1)
  {
   count++;
   str1++;
  }
  return count;
 }
 String(char *str="")     //構造函數
  :_str(new char[my_strlen(str) + 1])
  , _size(my_strlen(str))
 {
  my_strcpy(_str, str);
 }
 ~String()                 //析構函數
 {
  delete[] _str;
 }
 String(const String &str)     //拷貝構造
 {
  _size = str._size;
  _str = new char[my_strlen(str._str) + 1];
  my_strcpy(_str, str._str);
 }
 String &operator=(String &str) //賦值
 {
  if (this != &str)
  {
   if (_size < str._size)
   {
    delete[] _str;
    _str = new char[my_strlen(str._str) + 1];
   }
   _size = str._size;
   my_strcpy(_str, str._str);
  }
  return *this;
 }
 int my_strcmp(const char *str1, const char *str2)
 {
  while (*str1 == *str2)
  {
   if (*str1 == '\0')
   {
    return false;
   }
   str1++;
   str2++;
  }
  return *str1 - *str2;
 }
 //比較操作符
 bool operator==(const String &str)   
 {
  if (my_strcmp(_str, str._str) == 1)
  {
   return true;
  }
  return false;
 }
 bool operator!=(const String &str)
 {
  return !(_str == str._str);
 }
 bool operator>(const String &str)
 {
  if (my_strcmp(_str, str._str) > 0)
  {
   return true;
  }
  return false;
 }
 bool operator<(const String &str)
 {
  if (my_strcmp(_str, str._str) <0)
  {
   return true;
  }
  return false;
 }
 bool operator>=(const String &str)
 {
  return ((_str>str._str) || (_str == str._str));
 }
 bool operator<=(const String &str)
 {
  return ((_str < str._str) || (_str == str._str));
 }
 char & operator[](int index)    //下標操作符
 {
  if (index >= 0 && index < _size)
   return _str[index];
 }
 String insert(int pos, char ch)  //在pos後插入字符
 {
  char *_old = _str;
  _size = _size + 1;
  _str = new char[_size + 1];
  for (int i = 0; i < pos; i++)
  {
   *(_str + i) = *(_old + i);
  }
  for (int i = pos; i < pos + 1; i++)
  {
   *(_str+i) = ch;
  }
  for (int i = pos + 1; i < _size; i++)
  {
   *(_str + i) = *(_old + i - 1);
  }
  *(_str + _size) = '\0';
  delete _old;
  return *this;
 }
private:
     char *_str;
  int _size;  
};
String operator+(const String &str1,const  String &str2)
{
 String tmp("");
 tmp._size = str1._size + str2._size;
 tmp._str = new char[tmp._size + 1];
 strcpy(tmp._str, str1._str);
 strcat(tmp._str, str2._str);
 return tmp;
}
ostream& operator << (ostream &os, String &str)
{
 os << str._str << endl;
 return os;
}
int main()
{
 String str1("");
 String str2("abc");
 String  str3(str2);
 String  str4("a.b.c.");
 String str5("");
     str1=str4;
  str3.insert(2, 'a');
  str5 = str2 + str3;
  cout << str1 << endl;
 cout << str2 << endl;
 cout << str3 << endl;
 cout << str4 << endl;
 cout << str5 << endl;
 system("pause");
 return 0;
}

wKiom1bs1_XwX7BEAAAomIECGX0993.png

淺拷貝實現string類中的簡單幾個

#include<iostream>
using namespace std;
class String
{
public:
 friend ostream& operator << (ostream &os, String &str);
 char* my_strcpy(char *dest, char *src)
 {
  char *tmp = dest;
  while (*src!='\0')
  {
   *dest++ = *src++;
  }
  *dest = '\0';
  return tmp;
 }
 String(char *str = "") //構造函數
  :_str(new char[strlen(str)+5])
 {
  *(int *)_str = 1;  //計數器
  _str += 4;
  my_strcpy(_str, str);
 }
 ~String() //析構
 {
  if (_str != NULL)
  {
   if (--(*(int *)(_str-4))==0)
   {
    delete[] (_str-4);
   }
  }
 }
 String(String const &str)
 {
  _str = str._str;
  ++(*(int *)(_str-4));
 }
 String operator=(const String &str)
 {
  if (this != &str)   //自賦值
  {
   if (--(*(int *)(_str - 4)) == 0)
   {
    delete[](_str - 4);
   }
   _str = str._str;
   ++(*(int *)(_str - 4));
  }
  return *this;
 }
 char &operator[](int n)
 {
  return _str[n];
 }
private:
 char *_str;
};
ostream& operator << (ostream &os, String &str)
{
 os << str._str << endl;
 return os;
}
int main()
{
 String str1("what ");
 String str2(str1);
 cout << str2[2] << endl;
 String str3 = str1;
 cout << str1 << endl;
 cout << str2 << endl;
 cout << str3 << endl;
 system("pause");
 return 0;
}

wKioL1bs2IWwhcn7AAAnPPibGrE376.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章