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;
}

c++ 实现Sring类_第1张图片

浅拷贝实现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;
}

c++ 实现Sring类_第2张图片

你可能感兴趣的:(类,String)