string类的两种实现方法及string的一些成员函数的实现

string的第一种实现方法:

#include<iostream>
using namespace std;
class String
{
public:
     String(char *str="")//构造函数
      :_str(new char[strlen(str)+1])
     {
          strcpy(_str, str);
     }
     String(const String& str)//拷贝构造函数,实现深拷贝
     :_str(new char[strlen(str._str) + 1])
     { 
          strcpy(_str, str._str);
     }
      String& operator=(const String& str)//赋值操作符重载
     {
          if (this != &str)//判断是否是自赋值
          {
               delete[] _str;//释放原来得空间
               _str = new char[strlen(str._str) + 1];//开辟新的空间
               strcpy(_str, str._str);//赋值
           }
         return *this;//返回
     }
     ~String()//析构函数
     {
          delete[] _str;
          _str = NULL;
     }
private:
     char *_str;
};

string的第二种实现方法及一些成员函数的实现:

#include<iostream>
using namespace std;
#define DEFAULT_CAPACITY 3//默认容量
class String
{
public:
     String(char *str = "")//构造函数
      :_str(new char[strlen(str) + 1 + DEFAULT_CAPACITY])
      , _size(strlen(str))
      , _capacity(_size +1+DEFAULT_CAPACITY)
     {
          strcpy(_str, str);
     }
     ~String()//析构函数
     {
          if (_str != NULL)
          {
           delete[] _str;
           _str = NULL;
   
          }
     }
     String(const String& str)//拷贝构造函数
      :_str(NULL)
      , _size(str._size)
      , _capacity(str._capacity)
     {
          String tmp(str._str);//建立临时变量,tmp中的内容与str中的一样
          swap(_str, tmp._str);//交换两个字符串的地址,tmp出了函数系统自动调用析构函数回收内存空间
     }
     String& operator=(String str)//赋值运算符重载,参数是用拷贝构造函数构造的临时变量
     {
          _size = str._size;
          _capacity = str._capacity;
          swap(_str, str._str);//与拷贝构造函数的实现方法一致
          return *this;
      }
     bool operator==(const String& str);
     bool operator>(const String& str);
     bool operator<(const String& str);
     void CheckCapacity(int size);//检查容量是否够用,若是不够则扩容
     void insert(int pos, char ch);//按位置插入一个字符
     void insert(int pos, char *str);//按位置插入字符串
     void insert(int pos, const String& str);//按位置插入一个string类的字符串
     void PushBack(int ch);//尾插
     friend ostream& operator<<(ostream& output, const String& str);
     int MyStrcmp(const char *str1, const char *str2)
private:
     char *_str;
     int _size;//字符个数
     int _capacity;//容量
};

void String::PushBack(int ch)
{
     insert(_size, ch);
}
int String::MyStrcmp(const char *str1, const char *str2)
{
     while (*str1 == *str2)
     {
          if (*str1 == ‘\0‘)
           return 0;
          str1++;
          str2++;
     }
     return *str1 - *str2;
}
bool String::operator==(const String& str)
{
     if (MyStrcmp(_str, str._str) == 0)
          return true;
     else
          return false;
}
bool String::operator>(const String& str)
{
     if (MyStrcmp(_str, str._str) > 0)
          return true;
     else
          return false;
}
bool String::operator<(const String& str)
{
     if (MyStrcmp(_str, str._str) > 0)
          return true;
     else
          return false;
}
void String::CheckCapacity(int size)
{
     if (_capacity < size)
     {
          char *str = new char[size + DEFAULT_CAPACITY];
          strcpy(str, _str);
          delete[] _str;
          _str = str;
          _capacity = size + DEFAULT_CAPACITY;
     }
}
void String::insert(int pos, char ch)
{
     CheckCapacity(_size + 2);
     int end = _size;
     while (end >= pos)
     {
          _str[end + 1] = _str[end];
          end--;
     }
     _str[pos] = ch;
     _size += 1;
}
void String::insert(int pos, char *str)
{
     int len = strlen(str);
     CheckCapacity(_size + len+1);
     int end = _size;
     while (end >= pos)
     {
          _str[end +len] = _str[end];
          end--;
     }
     while (*str)
     {
          _str[pos++] = *str++;
     }
     _size = _size + len;
}
void String::insert(int pos, const String& str)
{
     insert(pos, str._str);
}
ostream& operator<<(ostream& output, const String& str)
{
     output << str._str;
     return output;
}
时间: 2024-10-10 05:09:18

string类的两种实现方法及string的一些成员函数的实现的相关文章

string 类操作的重载实现及其提供的其他常用成员函数

目录 1,string 类操作的重载实现 2,String类提供的其他常用成员函数 @ 1,string 类操作的重载实现 /* string 类操作的重载实现 */ class CMyString { public: CMyString(char *ptr = NULL) { if (ptr == NULL) { mpStr = new char[1]; *mpStr = '\0'; } else { mpStr = new char[strlen(ptr) + 1]; strcpy(mpSt

Javascript使用function创建类的两种方法

1.使用function类 //myFunction.js var CMyFunc=function() { //类的公共方法,供外部调用 this.Func1=function() { var i=0; return i; } this.Func2=function() { _privateFunc(); } //类中的私有方法,供公共方法调用 function _privateFunc() { return 0; ] } CMyFunc myFunc=new CMyFunc(); 使用:其它

angular2系列教程(十)两种启动方法、两个路由服务、引用类型和单例模式的妙用

今天我们要讲的是ng2的路由系统. 例子 例子是官网的例子,包含一个“危机中心”和“英雄列表”,都在一个app中,通过路由来控制切换视图.还包含了promise的用法,服务的用法等多个知识点. 源代码: https://github.com/lewis617/angular2-tutorial/tree/gh-pages/router 运行方法: 在根目录下运行: http-server 引入库文件设置base href 路由并不在ng2中,需要我们额外引入,另外我们需要设置base href,

String类原理分析及部分方法

//String类原理分析及部分方法 //http://www.cnblogs.com/vamei/archive/2013/04/08/3000914.html //http://www.cnblogs.com/YSO1983/archive/2009/12/07/1618564.html //String类包含在java.lang包中,这个包在java的时候就自动import //String类是唯一一个不需要new关键词来创建对象的类. public class Test{ public

java中实现多线程的两种基本方法

java中实现多线程有两种基本方法,一种是继承Thread, 另一种是实现Runnable接口. 但是因为java中子类只能继承一个父类,如果采用继承Thread类,就不能继承其他类,很受限制. 以下是采用继承Thread类的例子: public class MyThreadTest{ public static void main(String[] args){ MyThread amythread1=new MyThread("my thread 1"); MyThread amy

基于Apache+Tomcat负载均衡的两种实现方法

Apache+Tomcat实现负载均衡的两种实现方法 如果我们将工作在不同平台的apache能够实现彼此间的高效通信,因此它需要一种底层机制来实现--叫做apr Apr的主要目的就是为了其能够让apache工作在不同的平台上,但在linux上安装apache的时候通常都是默认安装的 [[email protected] ~]#rpm -qi aprName                 :apr                                        Relocation

C++ 中string类的三种模拟实现方式

1.原始版本(拷贝构造和赋值运算符重载时,需要重新开辟空间) #include <iostream> #include <string> using namespace std; class String { friend ostream& operator<<(ostream& os, const String& S); public: String(char* str = "") :_str(new char[strlen

黑马程序员【两种Ajax方法】

两种Ajax方法 Ajax是一种用于快速创建动态网页的技术,他通过在后台与服务器进行少量的数据交换,可以实现网页的异步更新,不需要像传统网页那样重新加载页面也可以做到对网页的某部分作出更新,现在这项技术已经被人们广泛应用,而对于一些对Web的了解还不是很深入的初学者,Ajax依然带着一层神秘的难懂的色彩,今天就在这里给大家以简单的方式解读一下Ajax的实现步骤和原理,并且给大家两种实现Ajax的方法,js和jquery. 首先ajax其实就是js+xml的技术,前端的表现就是一段js代码.要使用

C# 禁止windows程序重复运行的两种基本方法

一般的如果运行一个软件.让他处于运行状态,然后我们再去打开这个程序时就会提示我们“程序已启动或者不能重复启动此程序”,比如QQ对战平台 ,就限制一台机子启动两个QQ对战平台,那么他在C#中是如何实现的呢? 一般有两种方法,我是用的是第一种 方法1: 在项目的第一个窗体的启动事件中 如form1_load() 中添加如下语句=================================这是什么分割线==================================== #region 判断系