自己实现string类的相关函数

#include "kstring.h"
 
int kstring::m_number = 0;
 
kstring::kstring()                              //无参的构造函数
{
    m_str = new char[1];
    *m_str = '\0';
    m_length = 0;
    m_number++;
}
kstring::kstring(const char *t_str)              //有参的构造函数
{
    if(t_str == NULL)
    {
        m_str = new char[1];
        *m_str = '\0';
        m_length = 0;
    }
    else
    {
        m_length = strlen(t_str);
        m_str = new char[m_length + 1];
        strcpy(m_str,t_str);
        *(m_str + m_length) = '\0';
    }
 
    m_number++;
}
 
kstring::kstring(const kstring &t_str)           //拷贝构造函数
{
    m_length = t_str.m_length;
    m_str = new char[m_length + 1];
    strcpy(m_str,t_str.m_str);
    *(m_str + m_length) = '\0';
 
    m_number++;
}
 
kstring::~kstring()                             //析构函数
{
    delete [] m_str;
    m_str = NULL;
    m_length = 0;
    m_number--;
}
 
 
kstring & kstring::operator = (const kstring &t_str)          //重载赋值操作符
{
    if(this != &t_str)
    {
        if(m_length > t_str.m_length)
        {
            m_length = t_str.m_length;
            strcpy(m_str,t_str.m_str);
            *(m_str + m_length) = '\0';
        }
        else
        {
            delete [] m_str;
            m_length = t_str.m_length;
            m_str = new char[m_length + 1];
            strcpy(m_str,t_str.m_str);
            *(m_str + m_length) = '\0';
        }
    }
 
    return *this;
}
 
kstring & kstring::operator = (const char *t_str)
{
    if(t_str != NULL)
    {
        if(m_length > strlen(t_str))
        {
            m_length = strlen(t_str);
            strcpy(m_str,t_str);
            *(m_str + m_length) = '\0';
        }
        else
        {
            delete [] m_str;
            m_length = strlen(t_str);
            m_str = new char[m_length + 1];
            strcpy(m_str,t_str);
            *(m_str + m_length) = '\0';
        }
    }
 
    return *this;
}
 
kstring & kstring::operator += (const kstring &t_str)        //重载+=操作符,在后面追加Kstring对象
{
    char *t_str1 = m_str;
    int t_length = m_length;
 
    m_length = m_length + t_str.m_length;
    m_str = new char[m_length + 1];
    strcpy(m_str,t_str1);
    strcpy(m_str+t_length,t_str.m_str);
    *(m_str + m_length) = '\0';
 
    delete [] t_str1;
    t_str1 = NULL;
 
    return *this;
}
 
kstring & kstring::operator += (const char *t_str)           //重载+=操作符,在后面追加字符串
{
    char *t_str1 = m_str;
    int t_length = m_length;
 
    m_length = m_length + strlen(t_str);
    m_str = new char[m_length + 1];
    strcpy(m_str,t_str1);
    strcpy(m_str + t_length,t_str);
 
    *(m_str + m_length) = '\0';
 
    delete [] t_str1;
    t_str1 = NULL;
 
    return *this;
}
 
kstring & kstring::operator += (const char t_c)               //重载+=操作符,在后面追加字符
{
    char *t_str1 = m_str;
    int t_length = m_length;
 
    m_length = m_length + 1;
    m_str = new char[m_length + 1];
    strcpy(m_str,t_str1);
    *(m_str + t_length) = t_c;
    *(m_str + m_length) = '\0';
 
    delete [] t_str1;
    t_str1 = NULL;
 
    return *this;
}
 
bool operator == (const kstring &t_str1,const kstring &t_str2)   //重载比较操作符
{
    return strcmp(t_str1.m_str,t_str2.m_str) == 0;
}
 
bool operator != (const kstring &t_str1,const kstring &t_str2)   //重载不等于操作符
{
    return strcmp(t_str1.m_str,t_str2.m_str) != 0;
}
 
char kstring::operator [] (int t_index) const               //重载下标操作符
{
    return *(m_str + t_index);
}
 
ostream& operator << (ostream &os, const kstring &t_str)  //使用友元函数重载输出操作符
{
    os << t_str.m_str;
    return os;
}
 
istream& operator >> (istream &is, kstring &t_str)        //使用友元函数重载输入操作符
{
    is >> t_str.m_str;
    return is;
}
 
kstring operator + (const kstring &t_str1,const kstring &t_str2)
{
    kstring t_str;
 
    int t_length = t_str1.m_length + t_str2.m_length;
    t_str.m_length = t_length;
    t_str.m_str = new char[t_length + 1];
    strcpy(t_str.m_str,t_str1.m_str);
    strcpy(t_str.m_str + t_str1.m_length,t_str2.m_str);
 
    *(t_str.m_str + t_length) = '\0';
 
    return t_str;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值