string类的内部实现

string类的实现

实现string类是一道常见初级c++程序员的面试题,下面来具体介绍实现过程。
已知string的原型代码如下。从下图程序可以看出,string类的底层是一个字符指针。

class String
{
     public:
          String(const char *str=NULL);  //普通构造函数
          String(const String &other);    //拷贝构造函数
          ~String();                                  //析构函数
          String & operator =(const String &another); //赋值函数
          String & operator +(const String &another); //字符串连接
          bool operator ==(const String &another);    //判断相等
          int getLength();
     private:
         char *m_data;      //私有变量保存字符串
}

(1)普通构造函数实现过程

String::String(const char* str)
{
     if(str==NULL)
      {
           m_data=new char[1];
           *m_data='\0';
      }
      else 
      {
           int length=strlen(str);
           m_data=new char[length+1];
           strcpy(m_data,str);
      }
}

普通构造函数注意的是,传入的是个char*类型的字符串。如果传入的str是个空字符串,那么直接用\0赋值。
(2)String类的析构函数

String::~String()
{
       if(m_data)
       {
            delete[] m_data;//或者delete data;
            m_data=0;
       }
}

(3)拷贝构造函数

String::String(const String &another)
{
     if(!another.m_data)
     {
         m_data=0;
     }
     m_data=new char[strlen(another.m_data)+1];
     strcpy(m_data,another.m_data);
}

拷贝构造函数里要注意的是,传入的参数是一个常引用,这样可以不用增加一个栈变量和参数内容可以保持不变,不被修改。
(4)赋值函数

String::String::operator =(const String &another)
{
     if(this!=&another)
     {
        delete[] m_data;    //释放原有内存
        if(!another.m_data)
        {
             m_data=0;
        }
        else
       {
            m_data=new char[strlen(another.m_data)+1];
            strcpy(m_data,another.m_data);
       }
     }
     return *this;
}

赋值函数需要注意的是,如果传入的参数内容已与本身一致,则不需要赋值(常量区特性)。
(5)字符串连接

String& String::operator +(const String &another)
{
      String newString;
      if(!another.m_data)
      {
            newString=*this;
      }
      else if(!m_data)
      {
            newString=another;
      }
      else
      {
            newString.m_data=new char[strlen(m_data)+strlen(another.m_data)+1];
            strcpy(newString.m_data,m_data);
            strcat(newString.m_data,another.m_data);
      }
      return newString;
}

字符串连接函数里面分三种情况:传入参数为空,本身为空,或两者都不为空。
(6)判断相等

bool String::operator ==(const String &another)
{
      if(strlen(m_data)!=strlen(another.m_data))
      {
          return false;
      }
      else
      {
          return strcmp(m_data,another.m_data)?false:true;
      }
}

先判断长度是否一致,再判断内容是否相等。
(7)返回长度
int String::getLength()
{
   return strlen(m_data);
}

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值