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

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

  1. 
    
时间: 2024-10-02 21:10:43

c++ 实现Sring类的相关文章

Sring类的codePointAt()方法

工作中遇到一段代码 1 private static String getClassNameWithoutPackage(Class cl) { 2 String className = cl.getName(); 3 int pos = className.lastIndexOf(46) + 1; 4 if (pos == -1) 5 pos = 0; 6 7 return className.substring(pos); 8 } 于是看jdk API,发现String.lastIndexO

对象复制、克隆、深度clone

-------------------------------------------------------------------------------- ------------------------------------------------- 知道Java对对象和基本的数据类型的处理是不一样的.和C语言一样,当把Java的基本数据类型(如int,char,double等)作为入口参数传给函数体的时候,传入的参数在函数体内部变成了局部变量,这个局部变量是输入参数的一个拷贝,所有的

黑马程序员----Java高新技术之反射学习总结

------- android培训.java培训.期待与您交流! ---------- 反射的概念. 1.Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类中的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 精妙的总结就是:反射就是将Java类中的各个成分映射成相应的Java类. 3.在Java中,描述事物的各种类同样也是一种事物,也可以用面向对象的方法来描述,即也有一个类来描述众多的J

JAVA中的深复制和浅复制--建议多看几遍

转载:https://www.cnblogs.com/avivahe/p/5710945.html Java 语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用的区别,本文会试图澄清这一概念.并且由于Java不能通过简单 的赋值来解决对象复制的问题,在开发过程中,也常常要要应用clone()方法来复制对象.本文会让你了解什么是影子clone与深度clone,认识它 们的区别.优点及缺点. 看到这个标题,是不是有点困惑:Java语 言明确说明取消了指针,因为指针往

实习面试

2019年8月30中科曙光实习面试 说说集合有哪些 从数据结构的角度谈谈Arraylist与Linklist的区别 讲讲Hashmap与Treemap,讲一下底层原理 谈一下Sring类,StringBuilder和Stringbuffer有何区别 用过反射吗,简要说一下什么是反射 创建线程的基本方式 高并发相关的了解吗 jvm了解吗 java EE的框架会吗 [x]手写一个排序算法 单链表和双向链表有什么区别 重载和重写有什么区别 数据库中left join和right join 有什么区别

java 大数据处理类 BigDecimal 解析

这两天,由于我的必修课概率论里经常要用到排列组合的计算,感觉很麻烦,加上现代智能手机的计算器是没有这方面功能的. 所以,就自己动手写了个安卓的 排列组合 计算器,用了一天,发现有很大的问题,阶乘达百亿级别的数,程序将不再运行. 我这里举个例子,30的阶乘,30!=1x2x3x4x5....x30,这个明显是超出了整型 int 的范围了. 心想,试试长整型吧,后来发现,8字节的long 也是杯水车薪. 无奈求助百度,发现个好东西,BigDecimal 类. 查看了若干相关博文,发现全 TM 是复制

java常见类之String类

1.字符串概述 字符串:就是由多个字符组成的一串字符,也可以看成是字符数组. String类代表字符串,java程序中的字符串字面值,如"abc"等都作为此类的实例实现. 字符串是常量,一旦被赋值,就不能被改变. 2.String的构造方法 public String() 空构造 public String(byte[] bytes) 把字节数组转换成字符串 public String(byte[] bytes,int offset,int length) 把字节数组的指定索引长度的字

java中的枚举类

枚举类(enum),与class和interface关键字地位相同. 枚举类是一个特殊的类,可以有自己的成员变量.方法.构造器,可以实现一个或多个接口.一个java源文件中只能有一个public的enum类. 枚举类终究不是普通类,它与普通类有什么区别呢? enum默认继承的是java.lang.Enum类,而不是Object类.enum类不能显式继承其他父类. 使用enum定义.非抽象的枚举类默认会使用final修饰,因此enum类不能被继承(不能派生子类). 枚举类的构造器只能使用priva

Sring Cloud Gaeway是S酱爆鸡丁

半吊子全栈工匠一枚,20多年老码农,无所成,有初心,我相信 联系方式 [email protected] 最新评论 如何进入一个新领域 qukuailian666:有启发,进 @RequesMaing("exclusiveGaeway") ublic void exclusiveGaeway() { 根据bmn文件部署流程 reosioryServicecreaeDeloymen()addClassa 这就是合并完以后的文件;将生成的 IJKMediaFramework 文件替换掉 真